给出一组数据。
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'
的记录,但无法弄清楚如何做到这一点。
如果有人对此有更好的了解,我感激不尽。谢谢!
答案 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)