SQLite中CASE WHEN LIKE语句匹配特定子串返回NULL的问题求助
"cashtag":null返回NULL的问题 看起来你的查询逻辑本身没问题,但针对"cashtag":null的匹配失效了,大概率是实际存储内容和你用的匹配模式不匹配导致的,下面是几个常见原因和对应的排查/解决方法:
1. 转义字符/实体编码不匹配
你在查询里用了"(HTML实体的双引号),但如果数据库的COLUMNNAME列里存储的是原始双引号(也就是直接的"cashtag":null,而不是"cashtag":null),那这个模式肯定匹配不到。
试试把查询里的"换成实际的双引号,注意SQL里字符串用单引号包裹时,双引号不需要额外转义:
SELECT CASE WHEN COLUMNNAME LIKE '%"cashtag":null%' THEN 'NO CASH TAG' END COLUMNNAME FROM TABLENAME
如果你的数据库对双引号有特殊处理(比如PostgreSQL里双引号用于标识符),可以用转义后的双引号:
-- MySQL 示例 SELECT CASE WHEN COLUMNNAME LIKE '%\"cashtag\":null%' THEN 'NO CASH TAG' END COLUMNNAME FROM TABLENAME -- PostgreSQL 示例 SELECT CASE WHEN COLUMNNAME LIKE '%""cashtag"":null%' THEN 'NO CASH TAG' END COLUMNNAME FROM TABLENAME
2. 大小写敏感问题
有些数据库的LIKE操作是大小写敏感的(比如PostgreSQL默认、MySQL开启binary模式时),如果你的数据里是"Cashtag":null或者"cashtag":NULL,那小写的匹配模式就会失效。
可以用不区分大小写的方式匹配:
-- 通用方式:转成小写后匹配 SELECT CASE WHEN LOWER(COLUMNNAME) LIKE '%"cashtag":null%' THEN 'NO CASH TAG' END COLUMNNAME FROM TABLENAME -- MySQL 专用:使用LIKE的不敏感模式 SELECT CASE WHEN COLUMNNAME LIKE '%\"cashtag\":null%' COLLATE utf8_general_ci THEN 'NO CASH TAG' END COLUMNNAME FROM TABLENAME
3. 隐藏字符或编码差异
有时候数据里会有看不见的空格、制表符,或者字符编码不一致(比如全角冒号、特殊空格),导致视觉上一样但实际不匹配。
你可以先排查具体数据的细节:
-- 查看该单元格的字符长度 SELECT LENGTH(COLUMNNAME) FROM TABLENAME WHERE ... -- 加上定位该单元格的条件 -- 查看十六进制编码,对比手动输入的"cashtag":null的编码 SELECT HEX(COLUMNNAME) FROM TABLENAME WHERE ...
如果长度不一致或者编码有差异,就需要清理数据里的隐藏字符,或者调整匹配模式包含可能的空格(比如%"cashtag" : null%)。
4. 确认CASE WHEN的分支逻辑
默认情况下,CASE WHEN不满足条件时会返回NULL,你可以加个ELSE分支来明确是否真的没匹配到:
SELECT CASE WHEN COLUMNNAME LIKE '%"cashtag":null%' THEN 'NO CASH TAG' ELSE 'MATCH FAILED' END COLUMNNAME FROM TABLENAME
如果返回MATCH FAILED,就说明确实是匹配模式和数据不匹配,按照上面的方法继续排查;如果还是返回NULL,那可能是该单元格的内容确实不符合匹配条件。
内容的提问来源于stack exchange,提问作者SnakeDoc65

