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

PostgreSQL中JSON列的null值无法被IS NOT NULL过滤的问题

PostgreSQL可空JSON列"NULL"异常的原因解析

核心本质:两种完全不同的"空"

PostgreSQL的json(或jsonb)列存在两类极易混淆的"空"状态:

  • SQL NULL:数据库层面的空值,代表该列没有存储任何值,这才是IS NULL/IS NOT NULL判断的目标对象。
  • JSON NULL:属于合法的JSON数据值,即该列存储的是JSON格式的null,此时列本身在SQL层面是有值的(值就是这个JSON null),所以IS NOT NULL会判定为真,但用json_typeof()检测会返回'null'。

对应你的场景逻辑

  1. 执行SELECT ... WHERE option_mappings IS NOT NULL返回显示为"null"的行,是因为这些行存的是JSON NULL,并非SQL层面的空,所以会被IS NOT NULL筛选出来。
  2. WHERE option_mappings IS NULL无结果,说明你的表中根本没有真正的SQL NULL行,那些看起来是空的行全是JSON NULL。
  3. json_typeof(option_mappings) != 'null'能得到正确结果,是因为这个函数直接识别JSON内部的数据类型,精准排除了JSON NULL的情况。

实用扩展写法

如果业务上需要把JSON NULL和SQL NULL视为同一类空值,可以这么写条件:

WHERE option_mappings IS NULL OR json_typeof(option_mappings) = 'null'

要筛选真正包含有效JSON数据(既不是SQL NULL也不是JSON NULL)的行,除了你用的写法,也可以明确写成:

WHERE option_mappings IS NOT NULL AND json_typeof(option_mappings) != 'null'

内容的提问来源于stack exchange,提问作者ddjanke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:44:50