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

How to use operands for json in postgres

我正在使用 postgres 9.4。如何在 json postgres 中使用常规 ope运行ds,例如 < 、> <= 等,其中键是数字,值是文本,直到达到键数值的限制?

这是我的 table:

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"}'

如此 运行domly 直到键是 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?有没有办法缩短 运行 时间?

感谢任何帮助!

唯一可以在 jsonb(但不能在 json)上查询 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[]) 中并对其进行索引。