1. 程式人生 > 其它 >Oracle某列存多值查詢

Oracle某列存多值查詢

前言

一般資料庫在儲存時都會選擇存程式碼值,但是在運維中經常會用到通過SQL將這些值轉化成明文顯示,就查詢語句進行分享,辦法比較笨拙,僅供參考。

使用場景與效果

業務表S_A

IDNAMEPRODUCT_TYPE
1測試104
2測試202,03
3測試301,03,05

程式碼表DM_B

IDCODENAME
101論文
202著作
303報告
404專利
505其他

需要查詢的結果

IDNAMEPRODUCT_TYPEPRODUCT_NAME
1測試104專利
2測試202,03著作,報告
3測試301,03,05論文,報告,其他

Oracle資料庫查詢方法

1、建立一個檢視對LEVEL進行轉換

CREATE OR REPLACE VIEW VIEW_A AS  
SELECT  
  ID,  --需要查詢表中的的欄位,唯一主鍵
  NAME,--需要查詢表中的的欄位,如名稱
  regexp_substr(PRODUCT_TYPE, '[^,]+', 1, level) AS PRODUCT_TYPE --需要拆分的欄位,直接把PRODUCT_TYPE換成你要拆分的那個欄位即可
from 
S_A  -- 表名
where
 1=1  --你如果有條件,在此處加上即可,沒有的話去掉加1=1
connect by level <= regexp_count(PRODUCT_TYPE, ',') + 1  --需要拆分的欄位,直接把PRODUCT_TYPE換成你要拆分的那個欄位即可
and ID = prior ID --需要查詢表中的的欄位,唯一主鍵,把ID換成你表中的唯一主鍵即可,其他不變
and prior dbms_random.value is not null  --這句話照抄,不要改

檢視結果如下

2、通過上面建立的檢視查詢想要的結果

SELECT 
ID,
NAME,
PRODUCT_TYPE,
(SELECT LISTAGG((select NAME from DM_B WHERE CODE = a.PRODUCT_TYPE),',') within GROUP (order by a.ID) from VIEW_A  a where a.ID=S_A.id GROUP BY a.ID) AS PRODUCT_NAME
from  S_A;

得到最終結果如下,基本滿足想要的結果。

這個不是最優方案,只是解決查詢問題,如果有更好的方案歡迎指教。