首页 > 解决方案 > SQLite CASE LIKE 返回 NULL

问题描述

我正在尝试运行查询来检查子字符串,当该子字符串存在时,我希望查询返回我选择的值。

我运行 SELECT CASE WHEN COLUMNNAME LIKE '%"cashtag":null%' THEN 'NO CASH TAG' END COLUMNNAME FROM TABLENAME

我已经用不同的变量运行了这个相同的命令,它工作得很好。但是以这种方式编写以查找“cashtag”:null 我在查询结果中得到 NULL 的返回值。

我提供了一张我在 COLUMNAME 中的一个单元格的图像: 在此处输入图像描述

例如,对于这个特定的单元格,我希望在查询结果中返回 NO CASH TAG。但它返回NULL。不确定这个特殊的“cashtag”是什么:null 值会让人失望。正如我所说,我在 CASE WHEN LIKE 函数中使用了具有类似格式的其他值,它们工作得很好。

标签: sqlitecasesql-like

解决方案


我能想到的唯一可能发生的情况是如果在 substring 之前COLUMNAME包含 NUL 字符(ASCII 码) 。 如果发生这种情况,SQLite 的运算符将无法定位NUL 字符之后的子字符串。 例如:0'"cashtag":null'
LIKE

SELECT 'abc' || char(0) || 'def' LIKE '%e%'

返回0( FALSE)。
但:

SELECT 'abc' || char(0) || 'def' LIKE '%a%'

返回1( TRUE)。

您可以使用以下方法检查NUL 字符

SELECT INSTR(COLUMNNAME, char(0)) [position of NUL char]
FROM TABLENAME

在任何情况下,即使使用NUL 字符INSTR(),使用代替which 也可以:LIKE

SELECT 
  CASE WHEN INSTR(COLUMNNAME, '"cashtag":null') THEN 'NO CASH TAG' END COLUMNNAME 
FROM TABLENAME

这里唯一的区别是LIKE默认情况下不区分大小写但INSTR()区分大小写。
所以INSTR(COLUMNNAME, '"cashtag":null')不会找到'"Cashtag":NULL'
如果您还需要不区分大小写的搜索使用UPPER()功能:

SELECT 
  CASE WHEN INSTR(UPPER(COLUMNNAME), UPPER('"cashtag":null')) THEN 'NO CASH TAG' END COLUMNNAME 
FROM TABLENAME

现在的问题是,它UPPER()仅适用于字符串的 ASCII 字符,而不适用于 ASCII 范围之外的 UNICODE 字符。


推荐阅读