簡體   English   中英

如何使用array_agg()進行varchar []

[英]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 = 2131seids = '{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.

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