查询键不存在的Postgres JSONB

and*_*rue 6 postgresql jsonb

给定一组数据。

1 | { 'completed': true }
2 | { 'office_completed': false }
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以查询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'但无法弄清楚该怎么做的记录。

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

小智 12

仅供参考。

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

SELECT * FROM jsonb WHERE NOT( data ? 'office_completed' );
Run Code Online (Sandbox Code Playgroud)


kli*_*lin 8

使用coalesce()

select *
from jsonb
where coalesce(data->>'office_completed', 'false') <> 'true';

 id |            data             
----+-----------------------------
  1 | {"completed": true}
  2 | {"office_completed": false}
(2 rows)
Run Code Online (Sandbox Code Playgroud)

看看它怎么运作:

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)
Run Code Online (Sandbox Code Playgroud)