Postgres检查jsonb数组是不是不包含值返回空结果集
Posted
技术标签:
【中文标题】Postgres检查jsonb数组是不是不包含值返回空结果集【英文标题】:Postgres check if jsonb array not contains value returns empty result setPostgres检查jsonb数组是否不包含值返回空结果集 【发布时间】:2018-04-20 11:10:48 【问题描述】:需要检查 jsonb 列是否包含值。 Jsonb 字段是一个简单的数组:
ALTER TABLE task ADD COLUMN worker_ids jsonb;
UPDATE task SET worker_ids = '["1", "2"]' WHERE ...
然后尝试运行查询以检查它是否包含具体值:
检查 jsonb 是否包含值的查询 - 工作正常并返回正确的行集
SELECT * FROM task WHERE worker_ids ? '1'
但是,当我将 NOT
添加到 where 条件查询时,什么都不返回:
SELECT * FROM task WHERE NOT worker_ids ? '1'
我有什么问题吗?
【问题讨论】:
worker_ids
数组包含 1,那么您为什么期待结果?
其他worker_ids
字段是否为NULL?
与 null 的比较给出 null,不是 true 或 false,所以 not null ? value
不是 false,因此不会返回
@eurotrash true :) 我认为这很明显,因为当您知道它们都是正确的时,询问 为什么没有为 false 返回行 会很奇怪。但是,是的,你是对的 - 这是合乎逻辑的,并不明显
【参考方案1】:
https://www.postgresql.org/docs/current/static/functions-comparison.html
普通比较运算符产生 null(表示“未知”),而不是 真或假,当任一输入为空时。例如,7 = NULL 产生 null,就像 7 NULL 一样。当此行为不合适时,请使用 IS [ NOT ] DISTINCT FROM 谓词:
类似:
SELECT * FROM task WHERE (worker_ids ? '1') is distinct from true
应该有效
【讨论】:
以上是关于Postgres检查jsonb数组是不是不包含值返回空结果集的主要内容,如果未能解决你的问题,请参考以下文章