Если установить intarray
расширение это становится легким, вы можете использовать оператор &
, чтобы получить пересечение между двумя массивами:
with data (col1, col2) as (
values
(array[3,4,5], array[4,8,9]),
(array[1,2,3,4], array[6,5,1]),
(array[1,2,3,4], array[7,8,9,10])
)
select col1 & col2
from data
where cardinality(col1 & col2) > 0;
возвращается:
common_elements
---------------
{4}
{1}
Редактировать
Для этого без расширения или с bigint
массивами, лет u может отключить оба столбца в наборах, а затем выполнить пересечение на этих наборах. Это требует первичного ключа (или единственный) столбец на столе (который вы не упоминаете)
with data (id, col1, col2) as (
values
(1, array[3,4,5]::bigint[], array[4,8,9]::bigint[]),
(2, array[1,2,3,4]::bigint[], array[6,5,1]::bigint[]),
(3, array[1,2,3,4]::bigint[], array[7,8,9,10]::bigint[])
)
select id, array_agg(element) as elements
from (
select id, unnest(col1) as element
from data
intersect
select id, unnest(col2)
from data
) t
group by id;
возвращается:
id | elements
---+---------
1 | {4}
2 | {1}
спасибо:) ... и я удивляюсь, как я могу это сделать без этого расширения? – lowdegeneration
@lowdegeneration: почему? Это делает его простым и эффективным. И расширение является частью стандартной установки Postgres. Все, что вам нужно сделать, это 'create extension intarray;' –
ok еще раз спасибо ... я сделаю это. – lowdegeneration