2017-07-31 60 views
3

我有一個表,其中包含像這樣的數組中的值。如何在Postgres中查詢數組存儲列(數組相交)

id | contents_id 
1 | [1, 3, 5] 
2 | [1, 2] 
3 | [3, 4, 6] 
4 | [2, 5] 

如何編寫查詢數組例如[1, 2]這樣它檢查整個數組而不是數組的值?

如果找到任何常見的數組值,則獲取所有元組。

如果[1, 2]被查詢,因爲它包含12它必須從上述表中提取id =>1, 2, 4

回答

1

在1-D int數組&&運算符arrayoverlap是@LaposhasúAcsa建議的最快速度。

所以我的回答只有在arrayoverlap不可用或想要處理除一維整數數組以外的任何其他數據時纔會回答。

檢查UNNESThttps://www.postgresql.org/docs/current/static/functions-array.html

CREATE TABLE t45407507 (
    id SERIAL PRIMARY KEY 
    ,c int[] 
); 
insert into t45407507 (c) values 
    (ARRAY[1,3,5]) 
    , (ARRAY[1,2]) 
    , (ARRAY[3,4,6]) 
    , (ARRAY[2,5]); 

select DISTINCT id from 
    (SELECT id,unnest(c) as c 
    from t45407507) x 
where x.c in (1,2); 

可與LATERAL縮短加入

select DISTINCT id from 
    t45407507 x,unnest(c) ec 
where ec in (1,2); 

FROM子句中的逗號(,)是CROSS JOIN短符號。 LATERAL被自動假定爲表格函數unnest()

重寫WHERE使用ARRAY作爲參數

SELECT DISTINCT id FROM 
    t45407507 x,unnest(c) ec 
WHERE ec = ANY(ARRAY[1,2]); 
2

考慮使用intarray擴展。它提供了一個用於測試整數數組重疊的運算符。 Here是一個小提琴,舉一個例子。

select id from test where ARRAY[1,2] && contents_id; 

雖然你可以用運算符來查詢它,但我認爲用整數ID做一個結點表會更好。

+0

我應該添加'intarray'擴展名嗎?分開來查詢這種方式?很高興在小提琴中看到工作代碼。感謝那。 –

+0

如果尚未添加,則必須在服務器上創建它。你可以看到如何在小提琴的代碼中做到這一點。我已經評論過它,因爲它已經安裝在這些服務器上。 –