我試圖弄清楚如何在 postgres jsonb 陣列中“包含所有重復元素”。
我目前正在使用@>
which 當重復元素不在原始陣列中時回傳 true。
例如,我正在尋找此查詢回傳 true 的運算子:
select '[1, 2, 3]'::jsonb @> '[1, 2]';
但是這個查詢回傳 false
select '[1, 2, 3]'::jsonb @> '[1, 1]';
@>
兩者都回傳 true。
uj5u.com熱心網友回復:
沒有 json 包含函式可以測驗元素的包含,同時尊重元素的計數。
您可以自己撰寫這樣的函式,例如:
create or replace function jsonb_full_contain(a jsonb, b jsonb)
returns boolean language sql as $$
select not exists(
select 1 from (
select 't1' t, jsonb_array_elements(a) v
union all
select 't2', jsonb_array_elements(b) v
) tt
group by v
having count(case when t='t1' then 1 end) < count(case when t='t2' then 1 end))
$$;
select jsonb_full_contain('[1,2,3]'::jsonb, '[1,1]'::jsonb); -- returns false
select jsonb_full_contain('[1,2,3]'::jsonb, '[1]'::jsonb); -- returns true
小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506352.html
標籤:数据库 PostgreSQL