我有一個Postgres的表與陣列領域,並與下面的值 -選擇陣列值
我希望把所有這些都在field
列的id
值的行和這裏是我試過的查詢(現在簡化爲表別名):
SELECT tb1."id",
tb1."field",
tb1."field1"
FROM "polls_nullableintegerarraymodel" tb1
WHERE tb1."field" IN (ARRAY[tb1."id"])
但由於某些原因,它不會拉出值。
我有一個Postgres的表與陣列領域,並與下面的值 -選擇陣列值
我希望把所有這些都在field
列的id
值的行和這裏是我試過的查詢(現在簡化爲表別名):
SELECT tb1."id",
tb1."field",
tb1."field1"
FROM "polls_nullableintegerarraymodel" tb1
WHERE tb1."field" IN (ARRAY[tb1."id"])
但由於某些原因,它不會拉出值。
我期待這樣的事情:
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);
這可能是一個簡單的方法來完成你想要的東西,但是這似乎是你正在嘗試什麼。
- 試過這個查詢但它不起作用。 – user1050619
我的要求稍有不同。我想檢查數組字段是否包含任何id值。用別名更新。 – user1050619
這沒有任何意義。 'id'是一個數字,而不是一個數組。第二列是數組。 –
根據您的評論:
我要檢查,如果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()
在簡單例)。
但是我期望這個變體的性能會隨着大桌子的變壞而變差,因爲組裝後的陣列同樣變大。
有多種方法可以閱讀你的問題。請澄清。提供數據爲*文本*而不是截圖。提供Postgres版本和表定義,使示例有意義並添加預期結果。 –