[英]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
小提琴
簡單一點。 :)
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.