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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

count 多个字段_一句话实现字段拆分成多行

發(fā)布時(shí)間:2025/4/16 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 count 多个字段_一句话实现字段拆分成多行 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

用SQL來(lái)解決這個(gè)問(wèn)題非常煩瑣!

SQL里沒(méi)有提供集合對(duì)象,不能提供根據(jù)拆分后的字符串集合把一行變成多行的操作。解決這個(gè)問(wèn)題的思路就是先求出字段拆分后的最大字符串個(gè)數(shù)M,然后構(gòu)造一個(gè)M行1列的臨時(shí)表T2,其列名為lv,則各行l(wèi)v值分別為1,2,……,M,然后用原表與之叉乘,叉乘時(shí)取字段拆分后的第http://T2.lv個(gè)字符串。這樣寫出來(lái)的SQL是多個(gè)子查詢嵌套而成,其語(yǔ)法是比較復(fù)雜的。而且各種數(shù)據(jù)庫(kù)中拆分字符串的函數(shù)并不統(tǒng)一,所以SQL的寫法也各不相同。

舉個(gè)例子:現(xiàn)有學(xué)生選修課數(shù)據(jù)表COURSES數(shù)據(jù)如下,要求查出每個(gè)學(xué)生選修了幾門課:

要求輸出結(jié)果如下:

以O(shè)racle為例,用SQL寫出來(lái)是這樣:

SELECT STUDENT, COUNT(*) NUM FROM

(SELECT T1.COURSE, REGEXP_SUBSTR(T1.STUDENTS, '[^,]+', 1, http://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, http://T2.LV) IS NOT NULL

) C

GROUP BY STUDENT

ORDER BY NUM DESC;

這里的C就是前文提到的那個(gè)臨時(shí)表,可見(jiàn)這個(gè)SQL層次很多,可讀性比較差,不易讀懂。

如果用集算器的SPL語(yǔ)言來(lái)解決這個(gè)問(wèn)題,就會(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ò)展成多行的功能,所以寫起來(lái)思路清晰明了,簡(jiǎn)便易懂,并且語(yǔ)法統(tǒng)一,不論數(shù)據(jù)來(lái)自哪種數(shù)據(jù)庫(kù)還是來(lái)自文件型數(shù)據(jù)源,寫法都是一樣的。

SPL 集合還提供了交、差、并運(yùn)算,聚合運(yùn)算,循環(huán)遍歷運(yùn)算,請(qǐng)閱《SPL教案 集合》

SPL也能很方便地嵌入到JAVA應(yīng)用,可參考《Java 如何調(diào)用 SPL 腳本》。

具體使用方法可參考 《如何使用集算器》。

總結(jié)

以上是生活随笔為你收集整理的count 多个字段_一句话实现字段拆分成多行的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。