[英]How to transfer a column in an array using PostgreSQL, when the columns data type is a composite type?
我正在使用PostgreSQL 9.4,我正在嘗試在數組中傳輸列值。 對於“普通”(非用戶定義)數據類型,我可以使用它。
為了詳細解釋我的問題,我編寫了一個最小的例子。 假設我們定義一個復合類型“compo”並創建一個表“test_rel”並插入一些值。 看起來像這樣,適合我:
CREATE TYPE compo AS(a int, b int);
CREATE TABLE test_rel(t1 compo[],t2 int);
INSERT INTO test_rel VALUES('{"(1,2)"}',3);
INSERT INTO test_rel VALUES('{"(4,5)","(6,7)"}',3);
接下來,我們嘗試獲取具有列t2值的數組。 以下也有效:
SELECT array(SELECT t2 FROM test_rel WHERE t2='3');
現在,我們嘗試使用列t1(具有復合類型的列)執行相同的操作。 我現在的問題是,以下情況不起作用:
SELECT array(SELECT t1 FROM test_rel WHERE t2='3');
ERROR: could not find array type for data type compo[]
有人可以給我一個提示,為什么同樣的陳述不適合復合型? 我不僅是stackoverflow的新手,也是PostgreSQL和plpgsql的新手。 所以,請告訴我,當我做錯事的時候。
在PostgreSQL郵件列表中對此進行了一些討論。
長話短說,兩者兼而有之
select array(select array_type from ...)
select array_agg(array_type) from ...
表示PostgreSQL不支持的數組數組的概念。 PostgreSQL支持多維數組,但它們必須是矩形的。 F.ex. ARRAY[[0,1],[2,3]]
有效,但ARRAY[[0],[1,2]]
不是。
9.5中的數組構造函數和array_agg()
函數都有一些改進。
現在,他們明確指出,他們將數組參數作為多維數組累積,但前提是它的所有部分都具有相同的維度。
array()
構造函數:如果子查詢的輸出列是數組類型,則結果將是相同類型但更高維度的數組; 在這種情況下,所有子查詢行必須生成具有相同維度的數組,否則結果將不是矩形。
array_agg(any array type)
:輸入數組連接成一個更高維的數組(輸入必須都具有相同的維度,不能為空或NULL
)
對於9.4,您可以將數組包裝成row
:這樣,您可以創建一些東西, 幾乎是一個數組數組 :
SELECT array(SELECT ROW(t1) FROM test_rel WHERE t2='3');
SELECT array_agg(ROW(t1)) FROM test_rel WHERE t2='3';
或者,您可以使用遞歸CTE (和數組連接)來解決問題,例如:
with recursive inp(arr) as (
values (array[0,1]), (array[1,2]), (array[2,3])
),
idx(arr, idx) as (
select arr, row_number() over ()
from inp
),
agg(arr, idx) as (
select array[[0, 0]] || arr, idx
from idx
where idx = 1
union all
select agg.arr || idx.arr, idx.idx
from agg
join idx on idx.idx = agg.idx + 1
)
select arr[array_lower(arr, 1) + 1 : array_upper(arr, 1)]
from agg
order by idx desc
limit 1;
但是,當然這種解決方案高度依賴於您的數據(維度)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.