可以查询数据库中的空 jsonb

tim*_*one 4 postgresql json

我在 Postgres 9.6 db 中有一个表,其结构如下:

Table "public.pricings"
Column           |            Type             |                       Modifiers                       
---------------------------+-----------------------------+-------------------------------------------------------
id                        | integer                     | not null default nextval('pricings_id_seq'::regclass)
unconfirmed_matrix_prices | jsonb                       | not null default '"{}"'::jsonb
Run Code Online (Sandbox Code Playgroud)

我是使用 jsonb 的新手。

我想搜索任何空的 unconfirmed_matrix_prices(即默认值)。我看到我可以做这样的事情:

solar_dev=# select count(*) from json_object_keys('{"f1":1,"f2":2}');
 count 
-------
     2
(1 row)
Run Code Online (Sandbox Code Playgroud)

有没有办法可以做一个 where 短语,其中 json_object_keys 等于 0?我知道一些变通的方法 - 有更好的方法吗?

kli*_*lin 5

您可以简单地检查该值是否为默认值,例如:

select *
from pricings
where unconfirmed_matrix_prices = '"{}"';
Run Code Online (Sandbox Code Playgroud)

请注意,空的 jsonb 值应记为“{}”,因此默认值不是空的 jsonb。这对于某些类型的查询可能有问题,例如使用jsonb_each().我建议的函数以如下方式更正默认值:

alter table pricings alter unconfirmed_matrix_prices set default '{}';
update pricings
set unconfirmed_matrix_prices = '{}'
where unconfirmed_matrix_prices = '"{}"';
Run Code Online (Sandbox Code Playgroud)


Eva*_*oll 5

这是一个非常糟糕的主意。

not null default '"{}"'::jsonb
Run Code Online (Sandbox Code Playgroud)

那不是存储空对象。那是存储 .json 的 JSONB 字符串文字"{}"。你永远不想那样。您通常希望将其限制为特定的子类型,例如这样..

not null default '{}' CHECK (jsonb_typeof(unconfirmed_matrix_prices) = 'object')
Run Code Online (Sandbox Code Playgroud)

您通常也不希望将其设为非空。如果我需要这种约束,我宁愿拥有可空对象并防止空对象。这大大简化了您的查询(如此处所见)。

  • @duggi 是的 - 重构为使用 NULL - 谢谢! (2认同)