3

这是我正在使用的:

创建表测试(id INT,数据 JSON);
插入测试值
  (1, '[{"key": 2}, {"key": 1}]'),
  (2, '[{"key": 3}]'),
  (3, '[{"key": 1}]');


从测试中选择 *;
从测试中选择 id 1 == ANY( json_array_elements(data) ->> 'key');

我要做的是选择列中任何 json 对象data的键值key1. 我试图提取行13. 请注意,我不确定子句==之前的相等比较是否正确。ANY

当我运行上述内容时,我收到以下错误:ERROR: set-returning functions are not allowed in WHERE

4

2 回答 2

4

如果您可以自由使用jsonb而不是json(在大多数情况下更可取),请使用jsonb“包含”运算符@>

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<>在这里摆弄

有关的:

于 2018-08-03T20:26:58.577 回答
3

您可以使用EXISTS和相关的子查询来完成您想要的。

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

SQL小提琴

于 2018-08-03T20:16:24.173 回答