如何 select 至少有一个 json 元素符合某些条件的 postgres 行?
how to select postgres rows where at least one json element matches some criteria?
这是我正在处理的内容:
create table test(id INT, data JSON);
INSERT into test values
(1, '[{"key": 2}, {"key": 1}]'),
(2, '[{"key": 3}]'),
(3, '[{"key": 1}]');
select * from test;
select id from test where 1 == ANY( json_array_elements(data) ->> 'key');
我想要做的是 select data
列中任何 json 对象的所有行都有一个值为 key
的键1
。我试图提取行 1
和 3
。请注意,我不确定 ANY
子句之前的相等比较 ==
是否正确。
当我 运行 以上时,我得到以下错误: ERROR: set-returning functions are not allowed in WHERE
您可以使用 EXISTS
和相关的子查询来完成您想要的。
SELECT test.id
FROM test
WHERE EXISTS (SELECT *
FROM json_array_elements(test.data) jar(e)
WHERE jar.e->>'key' = '1');
如果有空可以使用jsonb
instead of json
(which is preferable in most cases), use the jsonb
"contains" operator @>
:
SELECT *
FROM test
WHERE data @> '[{"key": 1"}]';
可以使用默认运算符 class 或更专业的 jsonb_path_ops
:
的 GIN 索引来支持
CREATE INDEX test_data_gin_idx ON test USING gin (data jsonb_path_ops);
db<>fiddle here
相关:
- Index for finding an element in a JSON array
这是我正在处理的内容:
create table test(id INT, data JSON); INSERT into test values (1, '[{"key": 2}, {"key": 1}]'), (2, '[{"key": 3}]'), (3, '[{"key": 1}]'); select * from test; select id from test where 1 == ANY( json_array_elements(data) ->> 'key');
我想要做的是 select data
列中任何 json 对象的所有行都有一个值为 key
的键1
。我试图提取行 1
和 3
。请注意,我不确定 ANY
子句之前的相等比较 ==
是否正确。
当我 运行 以上时,我得到以下错误: ERROR: set-returning functions are not allowed in WHERE
您可以使用 EXISTS
和相关的子查询来完成您想要的。
SELECT test.id
FROM test
WHERE EXISTS (SELECT *
FROM json_array_elements(test.data) jar(e)
WHERE jar.e->>'key' = '1');
如果有空可以使用jsonb
instead of json
(which is preferable in most cases), use the jsonb
"contains" operator @>
:
SELECT *
FROM test
WHERE data @> '[{"key": 1"}]';
可以使用默认运算符 class 或更专业的 jsonb_path_ops
:
CREATE INDEX test_data_gin_idx ON test USING gin (data jsonb_path_ops);
db<>fiddle here
相关:
- Index for finding an element in a JSON array