mysql查詢包含逗號的數據,並逗號拆分為多行展現


  在做系統開發的時候,有可能是由於之前的遺留問題,導致在數據入庫的時候,將多個數據以逗號分隔的實行,存儲在一條數據中,例如:

ID VALUE
1 yang,zheng,song
2 zhao,qian,sun
3 jiang

 

 

 

 

現在因為新的需求,需要將這些數據以下邊的方式存儲在數據庫中,方便查詢和處理:

ID VALUE
1 yang
1 zheng
1 song
2 zhao
2 qian
2 sun
3 jiang

 

 

 

 

 

 

所以需要將原有的數據查詢出來,然后進行逗號分隔為多行,並插入到新的表中。

假設我們需要處理的表的結構為:

NAME TYPE LEN
ID INT 11
NAME VARCHAR 255

 

 

 

將數據查詢並分隔的sql語句為:

SELECT a.id,
substring_index( substring_index( a.name, ',', b.help_topic_id + 1 ), ',',- 1 ) name
FROM table1 a
JOIN mysql.help_topic b ON b.help_topic_id < ( length( a.name ) - length( REPLACE ( a.name, ',', '' ) ) + 1 ) 
ORDER BY a.id

插入就比較簡單了,使用insert into語句將查出的數據插入到相應的表中即可。

查詢的主要思路在於,和一個包含連續自增長字段的表進行 join,得到字符串分隔后的索引值,其中 

length( a.name ) - length( REPLACE ( a.name, ',', '' ) ) + 1 語句獲得字符串逗號分隔之后得到的數據長度,兩邊關聯之后,會得到相應行數的數據,比如數據
1 yang,zheng.song


在JOIN之后會得到:
ID NAME HELP_TOPIC_ID
1 yang,zheng,song 0
1 yang,zheng,song 1
1 yang,zheng,song 2





之后對查詢中的結果,借助substring_index方法進行截取,然后得到自己想要的數據。

我們在JOIN的時候借助了 mysql.help_topic 表,表中的help_topic_id是從0到582左右連續自增的數值,所以我們可以使用,如果有遇到數據經過逗號分隔之后得到的數組長度大於582,則需要自己建立一個連續自增表來進行JOIN,比如:
create table incre_table (AutoIncreID int);
insert into incre_table values (0);
insert into incre_table values (1);
insert into incre_table values (2);
。。。。。。。。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM