【问题标题】: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 返回行 会很奇怪。但是,是的,你是对的 - 这是合乎逻辑的,并不明显

标签: sql arrays postgresql jsonb


【解决方案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

应该有效

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 2020-10-10
    • 2023-04-01
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    相关资源
    最近更新 更多