簡體   English   中英

將數組映射到復合類型到不同的行類型

[英]Mapping array to composite type to a different row type

我想將GroupCount的鍵值對數組GroupsResult映射到僅映射特定鍵的 GroupsResult 復合類型。

我正在使用unnest將數組轉換為行,然后使用 3 個單獨的 select 語句來提取值。
對於如此簡單的事情,這感覺就像有很多代碼。

是否有更簡單/更簡潔的方法來進行從數組類型到GroupsResult類型的映射?

create type GroupCount AS (
    Name    text,
    Count   int
);

create type GroupsResult AS (
    Cats  int,
    Dogs  int,
    Birds int
);


WITH unnestedTable AS (WITH resultTable AS (SELECT ARRAY [ ('Cats', 5)::GroupCount, ('Dogs', 2)::GroupCount ] resp)
                    SELECT unnest(resp)::GroupCount t
                    FROM resultTable)
SELECT (
        (SELECT (unnestedTable.t::GroupCount).count FROM unnestedTable WHERE (unnestedTable.t::GroupCount).name = 'Cats'),
        (SELECT (unnestedTable.t::GroupCount).count FROM unnestedTable WHERE (unnestedTable.t::GroupCount).name = 'Dogs'),
        (SELECT (unnestedTable.t::GroupCount).count FROM unnestedTable WHERE (unnestedTable.t::GroupCount).name = 'Birds')
)::GroupsResult

小提琴

http://sqlfiddle.com/#!17/56aa2/1

簡單一點。 :)

SELECT (min(u.count) FILTER (WHERE name = 'Cats')
      , min(u.count) FILTER (WHERE name = 'Dogs')
      , min(u.count) FILTER (WHERE name = 'Birds'))::GroupsResult
FROM   unnest('{"(Cats,5)","(Dogs,2)"}'::GroupCount[]) u;

db<> 在這里擺弄

看:

細微的區別:如果其中一個名字多次彈出,我們的原始文件會引發異常,而這只會返回最小計數。 可能是也可能不是您想要的 - 如果永遠不會發生重復,則無關緊要。

對於許多不同的名稱, crosstab()通常更快。 看:

暫無
暫無

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

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