Postgres jsonb数组:查询非空交集

时间:2016-09-14 00:27:46

标签: postgresql jsonb

假设我在表value中有一个名为t的JSONB列,并且这些JSON blob内部是一个tags字段,它是一个字符串列表。

我想对标记为"foo""bar"的任何JSON blob进行查询。

因此,假设表数据如下所示:

value
---------------------
{"tags": ["other"]}
{"tags": ["foo", "quux"]}
{"tags": ["baz", "bar"]}
{"tags": ["bar", "foo"]}
{"tags": []}

我想写一些像这样的查询:

select value from t where value->'tags' NONEMPTY_INTERSECTION '["foo", "bar"]'

结果将是:

value
-----------------------
{"tags": ["foo", "quux"]}
{"tags": ["baz", "bar"]}
{"tags": ["bar", "foo"]}

是否存在可以实现此目的的实际查询,是否有任何可能快速的方法?

2 个答案:

答案 0 :(得分:3)

SELECT DISTINCT t.value
FROM t, jsonb_array_elements(t.value->'tags') tags
WHERE tags.value <@ '["foo", "bar"]'::jsonb;

答案 1 :(得分:0)

我正在寻找的运营商是?|,可以这样使用:

select t.value from t where value->'tags' ?| array['foo','bar'];

测试如下:

danburton=# select * from jsonb_test;
           value
---------------------------
 {"tags": ["foo"]}
 {"tags": ["other"]}
 {"tags": ["foo", "quux"]}
 {"tags": ["baz", "bar"]}
 {"tags": ["bar", "foo"]}
 {"tags": []}
(6 rows)

danburton=# select jsonb_test.value from jsonb_test where value->'tags' ?| array['foo','bar'];
           value
---------------------------
 {"tags": ["foo"]}
 {"tags": ["foo", "quux"]}
 {"tags": ["baz", "bar"]}
 {"tags": ["bar", "foo"]}
(4 rows)