查询Postgres JSONB,其中密钥不存在

时间:2016-08-18 20:51:41

标签: postgresql jsonb

给出一组数据。

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'的记录,但是如果密钥没有&#39}存在我从中得不到任何东西。如果密钥不存在,我认为它会算作!=true,但显然不会。 :-)我认为另一种方法是选择所有不具有office_completed密钥或office_completed != 'true'的记录,但无法弄清楚如何做到这一点。

如果有人对此有更好的了解,我感激不尽。谢谢!

2 个答案:

答案 0 :(得分:4)

仅供上一篇文章参考。

如果想要查找所有记录,请使用NOT(),如果没有密钥:

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

答案 1 :(得分: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)