如何在 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[]
) 中并对其进行索引。
我正在使用 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[]
) 中并对其进行索引。