跳至主要内容

PostgreSQL string_agg() 合併多筆 Records 的同欄位值

  • 批次合併 group by 後,每單一組內資料。
  • 呈現 group by 結果的集合資訊。

查詢時若有使用 group by 語法時會依指定條件將查出的資料做分組
而同一組中分組條件外其他欄位,若想顯示時可以利用 string_agg (欄位名, 串接符號) 來取得

使用情境:
例如有一個 Book table,book FK 至 Author table
今天想列出 每一位作者所著的書名時,可採用 string_agg 方法,來將不同 book records 的書名整在一起。

Book table

NameISBNAuthor_ID
小金魚逃走了12341
我的朋友22341
瑪蒂達32342
鱷魚怕怕、牙醫怕怕42341

Author table

IDAuthorPen_Name
1五味太郎太郎
2羅爾德·達爾羅德達爾

string_agg 相關參數

  • string_agg():
  • expression : 被組合的 column。expression 所以可以給予進一步變化。
    • ex: a.author || '-' || a.pen_name
  • separator :
  • order by : 這邊指的是 aggregated items 組合時的排序。下方例子便是依據書名排序後組合成一個欄位。

syntax: 注意!! separator [order_by_clause] 之間 沒有 逗號

STRING_AGG ( expression, separator [order_by_clause] )

範例:

select b.Author_ID, a.author, 
string_agg(name, ',' order by name desc ) as book_names,
from Book b
left join Author a
on b.Author_ID = a.id
group by a.author, b.Author_ID;
Author_IDAuthorbook_names
1五味太郎鱷魚怕怕、牙醫怕怕,我的朋友,小金魚逃走了
2羅爾德 達爾瑪蒂達

string_agg expression 參數範例

  • 包含取 JSONB values
  string_agg(jsonb_column->>'key_name', ',') as alias_name  

select patient
string_agg(ecd->>'inpatient_date', ',') as ip_dates
from clinical_record
group by patient;
  • 欄位先合併再串接
    string_agg(a.first_name || ' ' || a.last_name, ',' ) as full_names,