[英]How to use array_agg() for varchar[]
我的數據庫中有一個名為min_crew
的列,它有不同的字符數組,例如'{CA, FO, FA}'
。
我有一個查詢,我試圖獲取這些數組的聚合但沒有成功:
SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
, array_agg(se.min_crew)
FROM base.sched_entry se
LEFT JOIN base.user_sched_entry use ON se.sched_entry_id = use.sched_entry_id
WHERE se.sched_entry_id = ANY(ARRAY[623, 625])
GROUP BY user_sched_id;
623和625都具有相同的use.user_sched_id
,因此結果應該是seid和min_crew
的分組,但我只是不斷收到此錯誤:
ERROR: could not find array type for data type character varying[]
如果我刪除代碼的array_agg(se.min_crew)
部分,我會得到一個返回的表,其中user_sched_id = 2131
和seids = '{623, 625}'
。
標准聚合函數array_agg()
僅適用於基類型,而不適用於作為輸入的數組類型。 (但Postgres 9.5+有一個新的array_agg()
變體可以!)
您可以使用此相關答案中定義的自定義聚合函數array_agg_mult()
:
將數據選擇為Postgres數組
每個數據庫創建一次。 然后您的查詢可以像這樣工作:
SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
,array_agg_mult(ARRAY[se.min_crew]) AS min_crew_arr
FROM base.sched_entry se
LEFT JOIN base.user_sched_entry use USING (sched_entry_id)
WHERE se.sched_entry_id = ANY(ARRAY[623, 625])
GROUP BY user_sched_id;
鏈接答案中有詳細的理由。
在回復您的評論時,請考慮數組類型手冊中的引用:
多維數組必須具有每個維度的匹配范圍。 不匹配會導致錯誤。
沒有辦法,數組類型不允許Postgres中的這種不匹配。 您可以使用NULL值填充數組,以便所有維度都具有匹配的范圍。
但是為了這個查詢的目的,我寧願將數組轉換為帶有array_to_string()
的逗號分隔列表,並使用string_agg()
來聚合text
- 最好使用不同的分隔符。 在我的示例中使用換行符:
SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
,string_agg(array_to_string(se.min_crew, ','), E'\n') AS min_crews
FROM ...
您可能需要考慮開始規范化架構。 通常,您將使用此示例中概述的單獨表實現此類n:m關系:
如何在PostgreSQL中實現多對多關系?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.