Сравнение PostgreSQL JSON-массивов для любых совпадений - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь сравнить два массива JSON в PostgreSQL, чтобы выяснить, есть ли совпадения.Например, я ожидал бы true при сравнении '["foo", "bar", "baz"]' и '["qux", "bar"]' и false при сравнении '["foo", "bar", "baz"]' и '["qux", "quz"]'.Возможно ли это сделать в PostgreSQL без создания функции?

Ответы [ 3 ]

0 голосов
/ 16 февраля 2019
 select ARRAY(SELECT json_array_elements('["foo", "bar", "baz"]')::text)
 && ARRAY(SELECT json_array_elements('["qux", "bar"]')::text)
0 голосов
/ 17 февраля 2019

В итоге я использовал оператор ?| и произвел приведение к тексту, а затем перевел для создания массива

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

interests и tags, представляющих собой массивы jsonb

SELECT '["foo", "bar", "baz"]'::JSONB ?| TRANSLATE('["qux", "bar"]'::JSONB::TEXT, '[]','{}')::TEXT[]
0 голосов
/ 16 февраля 2019

Вы можете преобразовать массивы json в обычные и использовать оператор массива && .Вам нужна простая функция:

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)    
...