91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何用SQL實現字段拆分成多行

發布時間:2022-01-15 15:51:50 來源:億速云 閱讀:2392 作者:柒染 欄目:大數據

這篇文章給大家介紹如何用SQL實現字段拆分成多行,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

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

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

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

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

COURSESTUDENTS
Chinese    Tom,Kate,John,Jimmy
Russia     Tom,Cart,Jimmy
Spanish    Kate,Joan,Cart
Portuguese John,Tom
History    Tom,Cart,Kate
Music      Kate,Joan,Tom

要求輸出結果如下:

STUDENTNUM
Tom5
Kate4
Cart3
Jimmy2
Joan2
John2

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

關于如何用SQL實現字段拆分成多行就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

sql
AI

丰台区| 长武县| 濮阳县| 子长县| 哈巴河县| 通榆县| 东莞市| 于田县| 香河县| 泸西县| 洪雅县| 湖南省| 长乐市| 闵行区| 乌恰县| 沂南县| 黄大仙区| 当涂县| 老河口市| 深州市| 大同县| 宁波市| 光山县| 丁青县| 北辰区| 阜康市| 牟定县| 崇州市| 重庆市| 延庆县| 涪陵区| 渝北区| 太仓市| 三都| 黄冈市| 崇左市| 利津县| 潞城市| 西乡县| 湘潭县| 外汇|