SQLite CASE LIKE 返回 NULL

SQLite CASE LIKE returning NULL

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

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

我已经 运行 使用了不同变量的相同命令,并且运行良好。但是以这种方式编写以查找“cashtag”:null 我在查询结果中得到 return NULL 值。

我提供了一张图片,展示了我在 COLUMNAME 中的一个单元格的样子:

例如,对于这个特定的单元格,我希望在我的查询结果中得到 return 的 NO CASH TAG。但它 return 是 NULL。不确定这个特定的 "cashtag":null 值是什么意思,它会把事情搞砸。正如我所说,我在 CASE WHEN LIKE 函数中使用了具有类似格式的其他值,它们工作得很好。

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

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

returns 0 (FALSE).
但是:

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

returns 1 (TRUE).

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

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

在任何情况下,使用 INSTR() 而不是 LIKE,它甚至可以使用 NUL 字符:

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 字符。