假设我在表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"]}
是否存在可以实现此目的的实际查询,是否有任何可能快速的方法?
答案 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)