2016-02-18 118 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擴展這變得容易,您可以使用&接線員給兩個陣列之間的交集:編輯

common_elements 
--------------- 
{4}    
{1}    

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; 

回報

要做到這一點沒有擴展名或bigint陣列,喲你可以將兩個列放入集合中,然後在這些集合上進行交集。這需要一個主鍵(或唯一的)列在表(你沒有提到)

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安裝的一部分。所有你需要做的是'創建擴展intarray;' –

+0

好的再次感謝......我會這樣做。 – lowdegeneration