比较任何匹配项的 PostgreSQL JSON 数组

Comparing PostgreSQL JSON arrays for any matches

我正在尝试比较 PostgreSQL 中的两个 JSON 数组,看看是否有任何匹配项。例如,我希望在比较 '["foo", "bar", "baz"]''["qux", "bar"]' 时为真,在比较 '["foo", "bar", "baz"]''["qux", "quz"]' 时我希望为假。是否可以在不创建函数的情况下在 PostgreSQL 中执行此操作?

您可以将 json 数组转换为常规数组并使用 the array operator &&。您需要简单的功能:

create or replace function to_text_array(jsonb)
returns text[] language sql immutable as $$
    select array(select jsonb_array_elements_text())
$$;

示例:

with my_table(arr1, arr2) as (
values
    ('["foo", "bar", "baz"]'::jsonb, '["qux", "bar"]'::jsonb),
    ('["foo", "bar", "baz"]', '["qux", "quz"]')
)

select *, to_text_array(arr1) && to_text_array(arr2) as match
from my_table

         arr1          |      arr2      | match 
-----------------------+----------------+-------
 ["foo", "bar", "baz"] | ["qux", "bar"] | t
 ["foo", "bar", "baz"] | ["qux", "quz"] | f
(2 rows)    
 select ARRAY(SELECT json_array_elements('["foo", "bar", "baz"]')::text)
 && ARRAY(SELECT json_array_elements('["qux", "bar"]')::text)

我最终使用了 ?| 运算符并转换为文本,然后转换为创建数组

SELECT interests ?| TRANSLATE(tags::TEXT, '[]','{}')::TEXT[]

intereststags 是包含数组的 jsonb

SELECT '["foo", "bar", "baz"]'::JSONB ?| TRANSLATE('["qux", "bar"]'::JSONB::TEXT, '[]','{}')::TEXT[]