我正在尝试比较PostgreSQL中的两个JSON数组,以查看是否存在任何匹配项。例如,在比较'["foo", "bar", "baz"]'
和'["qux", "bar"]'
时,我希望是真,而在比较'["foo", "bar", "baz"]'
和'["qux", "quz"]'
时,我希望是假。不用创建函数就可以在PostgreSQL中做到这一点吗?
答案 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[]
interests
和tags
是包含数组的jsonb
SELECT '["foo", "bar", "baz"]'::JSONB ?| TRANSLATE('["qux", "bar"]'::JSONB::TEXT, '[]','{}')::TEXT[]