Oracle某列存多值查詢
阿新 • • 發佈:2021-05-08
前言
一般資料庫在儲存時都會選擇存程式碼值,但是在運維中經常會用到通過SQL將這些值轉化成明文顯示,就查詢語句進行分享,辦法比較笨拙,僅供參考。
使用場景與效果
業務表S_A
ID | NAME | PRODUCT_TYPE |
1 | 測試1 | 04 |
2 | 測試2 | 02,03 |
3 | 測試3 | 01,03,05 |
程式碼表DM_B
ID | CODE | NAME |
1 | 01 | 論文 |
2 | 02 | 著作 |
3 | 03 | 報告 |
4 | 04 | 專利 |
5 | 05 | 其他 |
需要查詢的結果
ID | NAME | PRODUCT_TYPE | PRODUCT_NAME |
1 | 測試1 | 04 | 專利 |
2 | 測試2 | 02,03 | 著作,報告 |
3 | 測試3 | 01,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;
得到最終結果如下,基本滿足想要的結果。
這個不是最優方案,只是解決查詢問題,如果有更好的方案歡迎指教。