1. 程式人生 > >Oracle 中使用 Regexp_substr 和 Connect By 來根據分隔符進行列轉行操作示例

Oracle 中使用 Regexp_substr 和 Connect By 來根據分隔符進行列轉行操作示例

先查詢出資料庫中記錄

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.附件名,';',''))