我有一个表来存储有关我的兔子的信息。它看起来像这样:
create table rabbits (rabbit_id bigserial primary key, info json not null);
insert into rabbits (info) values
('{"name":"Henry", "food":["lettuce","carrots"]}'),
('{"name":"Herald","food":["carrots","zucchini"]}'),
('{"name":"Helen", "food":["lettuce","cheese"]}');
我该如何找到喜欢胡萝卜的兔子呢?我想到了这个:
select info->>'name' from rabbits where exists (
select 1 from json_array_elements(info->'food') as food
where food::text = '"carrots"'
);
我不喜欢这个问题。太乱了。
作为一个全职的兔子饲养员,我没有时间去改变我的数据库模式。我只想正确地喂养我的兔子。有没有一种更可读的方法来完成这个查询?
8条答案
按热度按时间2eafrhcq1#
从PostgreSQL 9.4开始,可以使用
?
运算符:如果切换到 jsonb 类型,甚至可以在
"food"
键上索引?
查询:当然,作为一个全职的兔子饲养员,你可能没有时间做这些。
**更新:**下面是一个性能改进的演示,在一张有1,000,000只兔子的table上,每只兔子喜欢两种食物,其中10%喜欢胡萝卜:
3b6akqbq2#
您可以使用@〉操作符来执行类似于
qc6wkl3g3#
不是更聪明,而是更简单:
kxxlusnw4#
一个小的变化,但没有什么新的事实。它真的失去了一个功能...
5hcedyr05#
如果数组位于jsonb列的根位置,即列如下所示:
| 食物|
| - -|
| [“生菜”、“胡萝卜”]|
| [“胡萝卜”、“西葫芦”]|
只需在括号内直接使用列名:
ghg1uchk6#
不是更简单,而是更聪明:
x8diyxa77#
这可能会有所帮助。
输出:
oewdyzsn8#
如果你想检查完整的json而不是一个键,你可以直接从jsonb到text进行类型转换。