比较任何匹配项的 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[]
interests
和 tags
是包含数组的 jsonb
SELECT '["foo", "bar", "baz"]'::JSONB ?| TRANSLATE('["qux", "bar"]'::JSONB::TEXT, '[]','{}')::TEXT[]
我正在尝试比较 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[]
interests
和 tags
是包含数组的 jsonb
SELECT '["foo", "bar", "baz"]'::JSONB ?| TRANSLATE('["qux", "bar"]'::JSONB::TEXT, '[]','{}')::TEXT[]