日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle拆分字段为多行,一句话实现字段拆分成多行

發布時間:2025/3/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle拆分字段为多行,一句话实现字段拆分成多行 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

把表中某字段根據分隔符拆分成N個字符串后,再用這N個字符串把這一行演變成N行。

用SQL來解決這個問題非常煩瑣!

SQL里沒有提供集合對象,不能提供根據拆分后的字符串集合把一行變成多行的操作。解決這個問題的思路就是先求出字段拆分后的最大字符串個數M,然后構造一個M行1列的臨時表T2,其列名為lv,則各行lv值分別為1,2,……,M,然后用原表與之叉乘,叉乘時取字段拆分后的第T2.lv個字符串。這樣寫出來的SQL是多個子查詢嵌套而成,其語法是比較復雜的。而且各種數據庫中拆分字符串的函數并不統一,所以SQL的寫法也各不相同。

舉個例子:現有學生選修課數據表COURSES數據如下,要求查出每個學生選修了幾門課:

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

要求輸出結果如下:

STUDENT

NUM

Tom

5

Kate

4

Cart

3

Jimmy

2

Joan

2

John

2

以Oracle為例,用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就是前文提到的那個臨時表,可見這個SQL層次很多,可讀性比較差,不易讀懂。

如果用集算器的SPL語言來解決這個問題,就會簡單很多,只需1行代碼:

connect("mydb").query("SELECT * FROM COURSES").news(STUDENTS.split@c();~:STUDENT).groups(STUDENT;count(1):NUM).sort(-NUM)

SPL語言有集合對象,并提供了根據集合把一行擴展成多行的功能,所以寫起來思路清晰明了,簡便易懂,并且語法統一,不論數據來自哪種數據庫還是來自文件型數據源,寫法都是一樣的。

SPL 集合還提供了交、差、并運算,聚合運算,循環遍歷運算,請閱

SPL也能很方便地嵌入到JAVA應用,可參考

具體使用方法可參考

總結

以上是生活随笔為你收集整理的oracle拆分字段为多行,一句话实现字段拆分成多行的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。