如何选择至少一个json元素符合某些条件的postgres行?

时间:2018-08-03 20:03:17

标签: sql postgresql postgresql-json

这就是我正在使用的东西:

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的所有行。我试图提取13行。请注意,我不确定==子句之前的相等比较ANY是否正确。

运行上述命令时,出现以下错误:ERROR: set-returning functions are not allowed in WHERE

2 个答案:

答案 0 :(得分:3)

您可以使用EXISTS和相关子查询来完成所需的操作。

SELECT test.id
       FROM test
       WHERE EXISTS (SELECT *
                            FROM json_array_elements(test.data) jar(e)
                            WHERE jar.e->>'key' = '1');

SQL Fiddle

答案 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

相关: