2016-02-18 3 views
0

В той же строке;сопоставление двух столбцов матрицы postgresql-9.4-

Array column 1 has {2,4,5} value 
Array column 2 has {4,8,9} value 

Что я хочу сделать, это запрашивать строки в таблице, которая соответствует по меньшей мере, один номер в два столбца массива, которые соответствуют пример выше; номер 4 соответствует этому совпадению.

Как я могу запросить это, конечно, для каждых 2 столбцов массива в каждой строке таблицы? Я хочу выбрать строки, соответствующие 2 столбцам массива.

ответ

0

Если установить 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} 
+0

спасибо:) ... и я удивляюсь, как я могу это сделать без этого расширения? – lowdegeneration

+0

@lowdegeneration: почему? Это делает его простым и эффективным. И расширение является частью стандартной установки Postgres. Все, что вам нужно сделать, это 'create extension intarray;' –

+0

ok еще раз спасибо ... я сделаю это. – lowdegeneration

Смежные вопросы