我正在使用postgres 9.4。如何使用常规操作数,例如< ,> < = etc with json postgres,其中key是数字,value是文本,直到达到键数值的极限?
这是我的表:
create table foo (
id numeric,
x json
);
json的值如下:
id | x
----+--------------------
1 | '{"1":"A","2":"B"}'
2 | '{"3":"C","4":"A"}'
3 | '{"5":"B","6":"C"}'
等等,直到键为100
我正在尝试获取json键的所有id,键,值,其中键是< = 20.
我试过了:
select *
from foo
where x->>'key' <='5';
上面的查询运行了,应该给我20行输出,而不是它给了我0.下面的查询运行了,给了我20行但是花了30多分钟!
select
id
, key::bigint as key
, value::text as value
from foo
, jsonb_each(x::jsonb)
where key::numeric <= 100;
对于json,有没有办法使用for循环或do-while循环直到x = 20?有没有办法缩短运行时间?
任何帮助表示赞赏!
答案 0 :(得分:1)
唯一可以查询JSON密钥的运算符&amp;使用jsonb
上的索引(但不是json
上的索引)是?
operator。但遗憾的是,您无法将其与<=
结合使用。
但是,如果您查询的范围相对较小,则可以使用generate_series()
:
-- use `jsonb` instead of `json`
create table foo (
id numeric,
x jsonb
);
-- sample data
insert into foo
values (1, '{"1":"A","2":"B"}'),
(2, '{"3":"C","4":"A"}'),
(3, '{"5":"B","6":"C"}'),
(4, '{"7":"A","8":"B"}'),
(5, '{"9":"C","10":"A"}'),
(6, '{"11":"B","12":"C"}');
-- optionally an index to speed up `?` queries
create index foo_x_idx on foo using gin (x);
select distinct foo.*
from generate_series(1, 5) s
join foo on x ? s::text;
要使用更大的范围,您可能需要将x
的所有数字键提取到整数数组(int[]
)和&amp;索引。