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数组是不是不包含值返回空结果集的主要内容,如果未能解决你的问题,请参考以下文章

Postgres:从匿名jsonb数组元素中删除对象

Postgres jsonb“不包含”运算符

Postgres 检查空 JSONB 字段

Postgres 合并为空 JSONB 数组

postgres如何进行条件连接

postgres jsonb列中的模糊字符串匹配