查询键不存在的 Postgres JSONB

Query Postgres JSONB where key doesn't exist

给定一组数据。

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

有没有办法查询 office_completed != 'true' 并拥有 return 两条记录?或者 select 所有没有 office_completed 键的记录的方法?我可以查询所有具有 office_completed 键的记录:

SELECT * FROM jsonb WHERE data ? 'office_completed';

但是找不到拉对面的方法

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

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

使用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)

仅供参考post.

如果要查找所有没有键的记录,只需像这样使用 NOT():

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