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'。
对应你的场景逻辑
- 执行
SELECT ... WHERE option_mappings IS NOT NULL返回显示为"null"的行,是因为这些行存的是JSON NULL,并非SQL层面的空,所以会被IS NOT NULL筛选出来。 WHERE option_mappings IS NULL无结果,说明你的表中根本没有真正的SQL NULL行,那些看起来是空的行全是JSON NULL。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
相关产品推荐
相关产品推荐

