oracle拆分字段为多行,一句话实现字段拆分成多行
把表中某字段根據(jù)分隔符拆分成N個(gè)字符串后,再用這N個(gè)字符串把這一行演變成N行。
用SQL來解決這個(gè)問題非常煩瑣!
SQL里沒有提供集合對(duì)象,不能提供根據(jù)拆分后的字符串集合把一行變成多行的操作。解決這個(gè)問題的思路就是先求出字段拆分后的最大字符串個(gè)數(shù)M,然后構(gòu)造一個(gè)M行1列的臨時(shí)表T2,其列名為lv,則各行l(wèi)v值分別為1,2,……,M,然后用原表與之叉乘,叉乘時(shí)取字段拆分后的第T2.lv個(gè)字符串。這樣寫出來的SQL是多個(gè)子查詢嵌套而成,其語(yǔ)法是比較復(fù)雜的。而且各種數(shù)據(jù)庫(kù)中拆分字符串的函數(shù)并不統(tǒng)一,所以SQL的寫法也各不相同。
舉個(gè)例子:現(xiàn)有學(xué)生選修課數(shù)據(jù)表COURSES數(shù)據(jù)如下,要求查出每個(gè)學(xué)生選修了幾門課:
COURSE
STUDENTS
Chinese
Tom,Kate,John,Jimmy
Russia
Tom,Cart,Jimmy
Spanish
Kate,Joan,Cart
Portuguese
John,Tom
History
Tom,Cart,Kate
Music
Kate,Joan,Tom
要求輸出結(jié)果如下:
STUDENT
NUM
Tom
5
Kate
4
Cart
3
Jimmy
2
Joan
2
John
2
以O(shè)racle為例,用SQL寫出來是這樣:
SELECT STUDENT, COUNT(*) NUM FROM
(SELECT T1.COURSE, REGEXP_SUBSTR(T1.STUDENTS, '[^,]+', 1, T2.LV ) STUDENT
FROM COURSES T1,
( SELECT LEVEL LV
FROM (SELECT MAX(REGEXP_COUNT(A.STUDENTS, '[^,]+', 1)) R_COUNT
FROM COURSES A
) B
CONNECT BY LEVEL <= B.R_COUNT) T2
WHERE REGEXP_SUBSTR(T1.STUDENTS, '[^,]+', 1, T2.LV) IS NOT NULL
) C
GROUP BY STUDENT
ORDER BY NUM DESC;
這里的C就是前文提到的那個(gè)臨時(shí)表,可見這個(gè)SQL層次很多,可讀性比較差,不易讀懂。
如果用集算器的SPL語(yǔ)言來解決這個(gè)問題,就會(huì)簡(jiǎn)單很多,只需1行代碼:
connect("mydb").query("SELECT * FROM COURSES").news(STUDENTS.split@c();~:STUDENT).groups(STUDENT;count(1):NUM).sort(-NUM)
SPL語(yǔ)言有集合對(duì)象,并提供了根據(jù)集合把一行擴(kuò)展成多行的功能,所以寫起來思路清晰明了,簡(jiǎn)便易懂,并且語(yǔ)法統(tǒng)一,不論數(shù)據(jù)來自哪種數(shù)據(jù)庫(kù)還是來自文件型數(shù)據(jù)源,寫法都是一樣的。
SPL 集合還提供了交、差、并運(yùn)算,聚合運(yùn)算,循環(huán)遍歷運(yùn)算,請(qǐng)閱
SPL也能很方便地嵌入到JAVA應(yīng)用,可參考
。
具體使用方法可參考
。
總結(jié)
以上是生活随笔為你收集整理的oracle拆分字段为多行,一句话实现字段拆分成多行的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 时问轴php,php-发布到时间轴-过去
- 下一篇: jquery PHP 中文乱码,PHP输