这就是我正在使用的东西:
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');
我想做的是选择data
列中任何json对象具有键key
且值为1
的所有行。我试图提取1
和3
行。请注意,我不确定==
子句之前的相等比较ANY
是否正确。
运行上述命令时,出现以下错误:ERROR: set-returning functions are not allowed in WHERE
答案 0 :(得分:3)
您可以使用EXISTS
和相关子查询来完成所需的操作。
SELECT test.id
FROM test
WHERE EXISTS (SELECT *
FROM json_array_elements(test.data) jar(e)
WHERE jar.e->>'key' = '1');
答案 1 :(得分:3)
如果您可以自由使用jsonb
而不是json
(在大多数情况下更可取),请使用jsonb
"contains" operator @>
:
SELECT *
FROM test
WHERE data @> '[{"key": 1"}]';
可以通过默认操作符类别的GIN索引或更专业的jsonb_path_ops
来支持:
CREATE INDEX test_data_gin_idx ON test USING gin (data jsonb_path_ops);
db <>提琴here
相关: