在 Oracle 資料庫中,有一張TableReader(讀者表),其中ColReaderTypeIds欄位儲存的是逗號分隔的類型 ID,例如「1,2,3」。這些 ID 對應TableReaderType(讀者類型表)中的ReaderTypeId,分別代表「類型1」、「類型2」、「類型3」。由於類型表資料不固定,無法使用 CASE WHEN 硬編碼。需求是在查詢時,將ColReaderTypeIds顯示為對應的類型名稱,如「類型1,類型2,類型3」。
利用 Oracle 內建的 WM_CONCAT 聚合函數配合 INSTR 字串搜尋,即可在純 SQL 層面完成行轉列:
SELECT 讀者名稱, WM_CONCAT(ReaderTypeName)
FROM (
SELECT r.讀者名稱, t.ReaderTypeName
FROM TableReader r, TableReaderType t
WHERE INSTR(r.ColReaderTypeIds, t.ReaderTypeId) > 0
)
GROUP BY 讀者名稱;
WM_CONCAT 屬於非文件化函數(WMSYS.WM_CONCAT),Oracle 12c 以上版本建議改用標準的 LISTAGG,語法為 LISTAGG(ReaderTypeName, ',') WITHIN GROUP (ORDER BY ReaderTypeId),相容性與效能更佳。
若需去重或排序,可在子查詢中加入 DISTINCT 或 ORDER BY;若類型 ID 可能重複(如「1,1,2」),建議先用正則拆分再關聯,避免重複顯示。