2016-09-19 173 views
0

我有一個Postgres的表與陣列領域,並與下面的值 -選擇陣列值

enter image description here

我希望把所有這些都在field列的id值的行和這裏是我試過的查詢(現在簡化爲表別名):

SELECT tb1."id", 
     tb1."field", 
     tb1."field1" 
FROM "polls_nullableintegerarraymodel" tb1 
WHERE tb1."field" IN (ARRAY[tb1."id"]) 

但由於某些原因,它不會拉出值。

+0

有多種方法可以閱讀你的問題。請澄清。提供數據爲*文本*而不是截圖。提供Postgres版本和表定義,使示例有意義並添加預期結果。 –

回答

2

我期待這樣的事情:

SELECT am."id", am."field", am."field1" 
FROM "polls_nullableintegerarraymodel" am 
WHERE am."id" = ANY(am."field"); 

另外,還要注意表的別名如何使查詢更容易編寫和閱讀。

編輯:

下面是示例代碼示出該工作:

with t as (
     select 1 as id, '{2}'::integer[] as field1 union all 
     select 2 as id, '{1, 2}':: integer[] as field1 
    ) 
select * 
from t 
where id = any(field1); 

這僅返回的第二行。

編輯II:

你似乎想這樣的:

SELECT tb1."id", tb1."field", tb1."field1" 
FROM "polls_nullableintegerarraymodel" tb1 
WHERE tb1."field" <@ (SELECT array_agg("id") FROM tb1); 

這可能是一個簡單的方法來完成你想要的東西,但是這似乎是你正在嘗試什麼。

+0

- 試過這個查詢但它不起作用。 – user1050619

+0

我的要求稍有不同。我想檢查數組字段是否包含任何id值。用別名更新。 – user1050619

+0

這沒有任何意義。 'id'是一個數字,而不是一個數組。第二列是數組。 –

0

根據您的評論:

我要檢查,如果arrayfield包含任何的id值

該查詢返回其中field數組包含從任何id值的所有行同一張表(不只是同一行):

SELECT * 
FROM polls_nullableintegerarraymodel p1 
WHERE EXISTS (
    SELECT 1 
    FROM polls_nullableintegerarraymodel p2 
    WHERE p2.id = ANY(p1.field) 
    ); 

使用ANY構建體在一個EXISTS表達式:

同樣與array operators

SELECT * 
FROM polls_nullableintegerarraymodel p1 
WHERE field && (ARRAY(SELECT id FROM polls_nullableintegerarraymodel)); 

使用重疊算子&&和簡單ARRAY constructor(快於array_agg()在簡單例)。

但是我期望這個變體的性能會隨着大桌子的變壞而變差,因爲組裝後的陣列同樣變大。