sqlite - 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 函数中使用了具有类似格式的其他值,它们工作得很好。
解决方案
我能想到的唯一可能发生的情况是如果在 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 字符。
推荐阅读
- python - 为什么pysound输出空的wav文件?
- twitter-bootstrap - Bootstrap 5:文本框叠加和图像居中
- python - 列表中的重复元组
- mysql - 无法在docker内部连接mysql
- angular - 如何以角度将值从 index.html 传递到 main.ts
- ios - 如何让 SwiftUI 导航栏始终显示大标题
- jquery - 如何在 Bigcommerce 优化结帐中触发对无线电输入的反应
- javascript - 在 jsx 中使用 map() 渲染元素,相同的代码 firstone 无法渲染,但第二个可以
- python - 使用 Anaconda 在 Python 中调用模块 paddleocr 时出现问题
- arrays - C char 数组指针混淆