【问题标题】:Query Postgres JSONB where key doesn't exist查询不存在密钥的 Postgres JSONB
【发布时间】:2016-12-25 22:05:26
【问题描述】:

给定一组数据。

1 | { 'completed': true }
2 | { 'office_completed': false }

有没有办法查询office_completed != 'true' 并让它返回两条记录?或者选择所有没有office_completed 键的记录的方法?我可以查询所有具有office_completed 键的记录:

SELECT * FROM jsonb WHERE data ? 'office_completed';

但找不到相反的方法。

让我遇到这个问题的原因是我有一个可能有也可能没有office_completed 键的数据集,我需要查询所有具有office_completed != 'true' 的记录,但如果该键不存在,我什么也得不到从中。如果密钥不存在,我认为这会算作!=true,但显然不存在。 :-) 我想另一种方法是选择所有没有office_completed 键或office_completed != 'true' 但不知道该怎么做的记录。

如果有人对此有更好的想法,我将不胜感激。谢谢!

【问题讨论】:

    标签: postgresql jsonb


    【解决方案1】:

    仅供参考。

    如果想查找所有没有键的记录,只需使用 NOT() 即可:

    SELECT * FROM jsonb WHERE NOT( data ? 'office_completed' );
    

    【讨论】:

    • 这应该是一个认可的答案。更改 jsonb 运算符的聪明方法。 jsonb_column 中存在的多个键:SELECT * FROM some_table WHERE jsonb_column ?| '{ "filter", "existed" }'::text[] jsonb_column 中不存在的多个键:SELECT * FROM some_table WHERE NOT( jsonb_column ?| '{ "filter", "not", "existed" }'::text[])
    【解决方案2】:

    使用coalesce():

    select *
    from jsonb
    where coalesce(data->>'office_completed', 'false') <> 'true';
    
     id |            data             
    ----+-----------------------------
      1 | {"completed": true}
      2 | {"office_completed": false}
    (2 rows)
    

    看看它是如何工作的:

    select *, data->>'office_completed' as value, coalesce(data->>'office_completed', 'false')
    from jsonb
    where coalesce(data->>'office_completed', 'false') <> 'true';
    
     id |            data             | value | coalesce 
    ----+-----------------------------+-------+----------
      1 | {"completed": true}         |       | false
      2 | {"office_completed": false} | false | false
    (2 rows)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多