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 字符。
我正在尝试 运行 查询来检查子字符串,当该子字符串存在时,我希望查询 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 字符。