如何在postgres中使用json的操作数

时间:2016-01-27 09:30:44

标签: json postgresql operands

我正在使用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?有没有办法缩短运​​行时间?

任何帮助表示赞赏!

1 个答案:

答案 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;索引。