簡體   English   中英

如何在Postgres中查詢數組存儲列,(數組交集)

[英]How to query array stored column in Postgres, (array intersection)

我有一個表格,其中包含類似這樣的數組值。

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

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

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

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

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

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

雖然您可以使用運算符查詢它,但我認為最好使用整數ID創建聯結表。

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

所以我的答案只有在arrayoverlap不可用或想要使用除一維整數數組以外的任何東西時才會有效。

檢查UNNEST https://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]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM