Oracle 中使用 Regexp_substr 和 Connect By 來根據分隔符進行列轉行操作示例
阿新 • • 發佈:2019-02-16
先查詢出資料庫中記錄
select t.ID,t.儲存名稱,t.儲存路徑,t.上傳人,t.上傳時間 from zlmaindata.投標記錄 t
以上為查詢結果,我要將【儲存名稱】多檔名按照分號進行分割,然後轉換為兩行。
使用如下程式碼查詢:
查詢結果如下:with t1 as( select 儲存名稱 as c1,儲存路徑,上傳人,上傳時間 from zlmaindata.投標記錄 where id='') select distinct regexp_substr(t1.儲存名稱, '[^;]+',1,level) as 檔案儲存名稱,儲存路徑,t1.上傳人,t1.上傳時間,regexp_substr(相關附件, '[^;]+',1,level) as 相關附件 from zlmaindata.投標記錄 connect by level <= length(儲存名稱) - length(replace(儲存名稱,';',''));
根據結果看達到我的最初目的。
這裡說一下這段的作用:
with t1 as(
select 儲存名稱 as c1,儲存路徑,上傳人,上傳時間
from zlmaindata.投標記錄 where id='')
with as 是先將需要進行操作的資料先查詢出來建立一張虛擬表,後面的sql直接從虛擬表中取資料進行函式操作,避免了全表掃描,大大提高了查詢轉換效率。
以下是另外一個查詢示例:
with t as ( select q.* from( select rownum as 序號,y.ID as 記錄ID,y.附件名,y.登記人,y.登記時間,y.附件路徑 from zlmaindata.使用者服務單 y where y.附件名 is not null and y.附件路徑 is not null ) q where q.序號 between 1 and 20 ) select distinct t.記錄ID,regexp_substr(t.附件名, '[^;]+',1,level) as 檔名,'客戶服務' as 模組名稱,t.登記人 as 上傳人,t.登記時間 as 上傳時間,regexp_substr(t.附件名, '[^;]+',1,level) as 儲存名,t.附件路徑 as 儲存路徑 from t connect by level <= length(t.附件名) - length(replace(t.附件名,';',''))