我想將一組鍵值對映射到僅映射特定鍵GroupCount的復合型別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
uj5u.com熱心網友回復:
簡單一點。:)
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()通常更快。看:
- PostgreSQL 交叉表查詢
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/389916.html
標籤:sql PostgreSQL的 铸件 复合类型 聚合过滤器
上一篇:兩個時間段內出現的IDS數量不同
