首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Oracle 純 SQL 實現行轉列:將讀者類型 ID 轉換為名稱

     編輯:程式設計疑難解答

問題背景

在 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 讀者名稱;

核心邏輯解析

  • INSTR 函數:判斷讀者表的逗號分隔字串中是否包含某個類型 ID,若包含則返回位置(>0),實現多對多的隱性關聯。
  • WM_CONCAT:將同一讀者對應的多行類型名稱合併為單一字串,預設以逗號分隔。
  • 分組查詢:按讀者名稱分組,確保每位讀者僅輸出一行結果。

注意事項

WM_CONCAT 屬於非文件化函數(WMSYS.WM_CONCAT),Oracle 12c 以上版本建議改用標準的 LISTAGG,語法為 LISTAGG(ReaderTypeName, ',') WITHIN GROUP (ORDER BY ReaderTypeId),相容性與效能更佳。

延伸應用

若需去重或排序,可在子查詢中加入 DISTINCT 或 ORDER BY;若類型 ID 可能重複(如「1,1,2」),建議先用正則拆分再關聯,避免重複顯示。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved