簡體   English   中英

當列數據類型是復合類型時,如何使用PostgreSQL傳輸數組中的列?

[英]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.

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