主頁(yè) > 知識(shí)庫(kù) > Oracle數(shù)據(jù)行拆分多行方法示例

Oracle數(shù)據(jù)行拆分多行方法示例

熱門標(biāo)簽:呼倫貝爾智能手機(jī)地圖標(biāo)注 南寧人工智能電銷機(jī)器人費(fèi)用 海南400電話哪里辦理 圖像地圖標(biāo)注 濟(jì)南地圖標(biāo)注公司 貴陽(yáng)電話外呼系統(tǒng)哪家好 分布式呼叫中心 安陽(yáng)外呼系統(tǒng)免費(fèi) 400電話是不是免費(fèi)申請(qǐng)

工作和學(xué)習(xí)中常常會(huì)遇到一行要分割成多行數(shù)據(jù)的情況,在此整理一下做下對(duì)比。

單行拆分

如果表數(shù)據(jù)只有一行,則可以直接在原表上直接使用connect by+正則的方法,比如:

select regexp_substr('444.555.666', '[^.]+', 1, level) col
from dual
connect by level = regexp_count('444.555.666', '\.') + 1 

輸出結(jié)果:

COL
----
444
555
666

多行拆分

如果數(shù)據(jù)表存在多行數(shù)據(jù)需要拆分,也可以在原表上使用connect+正則的方法:

方法一

with t as
(select '111.222.333' col
from dual
union all
select '444.555.666' col
from dual)
select regexp_substr(col, '[^.]+', 1, level)
from t
connect by level = regexp_count(col, '\.\') + 1
and col = prior col
and prior dbms_random.value > 0

結(jié)果:

---------
111
222
333
444
555
666

方法二

使用構(gòu)造的最大行數(shù)值關(guān)聯(lián)原表:

with t as
(select '111.222.333' col
from dual
union all
select '444.555.666' col
from dual)
select regexp_substr(col, '[^.]+', 1, lv)
from t, (select level lv from dual connect by level  10) b
where b.lv = regexp_count(t.col, '.') + 1 

這種方法設(shè)置第二個(gè)數(shù)據(jù)集的時(shí)候要小于可能的最大值,然后兩數(shù)據(jù)集做關(guān)聯(lián),在做大數(shù)據(jù)量拆分的時(shí)候,這個(gè)數(shù)值設(shè)置得當(dāng),拆分行數(shù)相對(duì)一致的情況下,效率比方法一直接connect by要高。

方法三

使用table函數(shù):

with t as
(select '111.222.333' col
from dual
union all
select '444.555.666' col
from dual)
select column_value
from t,
table(cast(multiset
(select regexp_substr(col, '[^.]+', 1, level) dd
from dual
connect by level = regexp_count(t.col, '\.\') + 1) as
sys.odcivarchar2list)) a 

結(jié)果:

COLUMN_VALUE
-------------
111
222
333
444
555
666

這個(gè)方法輸出的列名是固定的,column_value依賴于sys.odcivarchar2list這個(gè)類型的輸出,該方法對(duì)于大數(shù)據(jù)量的拆分效率比第二個(gè)方法好。

方法四

with t as
(select '111.222.333' col
from dual
union all
select '444.555.666' col
from dual)
select regexp_substr(col, '[^.]+', 1, trim(column_value))
from t,
xmltable(concat('1 to ',regexp_count(t.col, '.') + 1)) a ;

注意:大數(shù)據(jù)量的拆分時(shí),謹(jǐn)慎使用正則的方法去做,可以使用substr+instr的方式替換正則。

如果以上方法的效率仍然不理想,可考慮使用plsql塊。

總結(jié)

以上就是本文關(guān)于Oracle數(shù)據(jù)行拆分多行方法示例的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以參閱:PLSQL Developer登錄的默認(rèn)密碼介紹、ORACLE SQL語(yǔ)句優(yōu)化技術(shù)要點(diǎn)解析、淺談oracle rac和分布式數(shù)據(jù)庫(kù)的區(qū)別、oracle 數(shù)據(jù)庫(kù)啟動(dòng)階段分析等。有什么問題可以隨時(shí)留言,歡迎大家交流討論。

您可能感興趣的文章:
  • Oracle以逗號(hào)分隔的字符串拆分為多行數(shù)據(jù)實(shí)例詳解

標(biāo)簽:焦作 滁州 涼山 郴州 合肥 遼源 許昌 南充

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Oracle數(shù)據(jù)行拆分多行方法示例》,本文關(guān)鍵詞  Oracle,數(shù)據(jù),行拆,分多,行,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Oracle數(shù)據(jù)行拆分多行方法示例》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Oracle數(shù)據(jù)行拆分多行方法示例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章