You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:45:19