我在 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?我知道一些变通的方法 - 有更好的方法吗?
您可以简单地检查该值是否为默认值,例如:
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)
这是一个非常糟糕的主意。
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)
您通常也不希望将其设为非空。如果我需要这种约束,我宁愿拥有可空对象并防止空对象。这大大简化了您的查询(如此处所见)。
| 归档时间: |
|
| 查看次数: |
13664 次 |
| 最近记录: |