比较PostgreSQL JSON数组是否匹配

时间:2019-02-15 22:24:38

标签: arrays postgresql jsonb

我正在尝试比较PostgreSQL中的两个JSON数组,以查看是否存在任何匹配项。例如,在比较'["foo", "bar", "baz"]''["qux", "bar"]'时,我希望是真,而在比较'["foo", "bar", "baz"]''["qux", "quz"]'时,我希望是假。不用创建函数就可以在PostgreSQL中做到这一点吗?

3 个答案:

答案 0 :(得分:2)

 select ARRAY(SELECT json_array_elements('["foo", "bar", "baz"]')::text)
 && ARRAY(SELECT json_array_elements('["qux", "bar"]')::text)

答案 1 :(得分:1)

您可以将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($1))
$$;

示例:

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)    

答案 2 :(得分:0)

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

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

intereststags是包含数组的jsonb

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