如何 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。我试图提取行 13。请注意,我不确定 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');

SQL Fiddle

如果有空可以使用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