SQL使用NOT LIKE查询JSON字段未正确过滤"A":null行问题
问题原因
用字符串LIKE做JSON内容匹配本身就不具备可靠性,你写的过滤规则失效核心原因是匹配规则和实际存储的JSON字符串格式不匹配:
- 你写的匹配串
'%"A": null%'强制要求冒号和null之间存在1个空格,但JSON语法对键值对之间的空白字符没有强制要求:实际存储的内容可能是无空格的{"A":null}、冒号前后带多空格的{ "A" : null }、带换行缩进的格式化版本,这些格式下"A": null这个固定字符串根本不存在,自然无法被匹配到,对应行也就不会被NOT LIKE排除。 - 字符串匹配完全不感知JSON的语法结构,哪怕你调整匹配规则覆盖了所有空白场景,后续还可能遇到A出现在其他键名、A出现在字符串值内容、嵌套结构同名键等误匹配问题,稳定性极差。
正确实现方式
所有支持JSON字段类型的数据库都提供了原生JSON处理函数,直接通过JSON路径查询判断键值状态才是可靠方案,核心逻辑统一为:排除「键A存在,且A的值为JSON null」的行。
不同数据库的参考写法如下:
- MySQL 5.7+ 版本:
SELECT * FROM t WHERE NOT ( -- 判断A键存在 JSON_CONTAINS_PATH(JsonColumn, 'one', '$.A') = 1 -- 判断A键的值为null AND JsonColumn->'$.A' IS NULL )
- PostgreSQL 版本:
SELECT * FROM t WHERE NOT ( JsonColumn ? 'A' AND JsonColumn->>'A' IS NULL )
- SQL Server 版本:
SELECT * FROM t WHERE NOT ( JSON_PATH_EXISTS(JsonColumn, '$.A') = 1 AND JSON_VALUE(JsonColumn, '$.A') IS NULL )
注:如果你用的数据库版本不支持JSON类型、只能存字符串类型的JSON内容,至少要把匹配规则改成兼容空白的正则匹配模式替换普通LIKE,但这种方案依然存在误匹配风险,仅作为临时兜底方案。
内容的提问来源于stack exchange,提问作者Bassie
相关产品推荐
相关产品推荐

