1. 程式人生 > >mysql 利用分割符SUBSTRING_INDEX進行字串資料拆分

mysql 利用分割符SUBSTRING_INDEX進行字串資料拆分

我們要將一個字串的資料根據指定的符號進行拆分,我這裡用逗號(,)分割,要將資料分成每條4個數據,結果如下圖:


準備資料表:substring_index_test


    其中我們要用到的關鍵函式:

substring_index(str,delim,count):(被擷取欄位,關鍵字,關鍵字出現的次數)
length(str):(欄位)  (一個漢字是算三個字元,一個數字或字母算一個字元)
replace(field,find_str,replace_str): (被替換欄位,欄位中被替換內容,替換的內容)
cast(value as type):(被轉換型別的值 as 轉換的型別)

ceil(X):返回不小於X的最小整數值。

我們先做出每條資料的結果:

1.進行每條值查詢:

select SUBSTRING_INDEX(t.name,',','4') from substring_index_test t;

結果:


2.第二條資料查詢:

select SUBSTRING_INDEX(SUBSTRING_INDEX(t.name,',',-(length(t.name) - length(REPLACE(t.name, ',', '')) + 1)+4),',','4') from substring_index_test t;

結果:


3.第三條資料查詢:

select SUBSTRING_INDEX(SUBSTRING_INDEX(t.name,',',-(length(t.name) - length(REPLACE(t.name, ',', '')) + 1)+8),',','4') from substring_index_test t;

結果:


可以看出規律,得出以下結論:

select SUBSTRING_INDEX(SUBSTRING_INDEX(t.name,',',-(length(t.name) - length(REPLACE(t.name, ',', '')) + 1)+4x),',','4') from substring_index_test t, x為變數。

我們單獨查出資料,然後我們進行組合:

4.我們可以利用length和replace來計算出可以拆分多少:先用length算出資料的長度,然後再用replace替換掉(,),再用length算出長度,再進行相減+1,最終得到可以分割的值;如下:

SELECT (length(t.name) - length(REPLACE(t.name, ',', '')) + 1) FROM substring_index_test t

結果如下:


然後算出我們需要看出有多少行資料,利用ceil(x)函式,如下:

SELECT ceil((length(t.name) - length(REPLACE(t.name, ',', '')) + 1)/4) FROM substring_index_test t;

結果:


然後我們可以根據以上規則進行關聯查詢,請注意:cast(h.help_topic_id as SIGNED INTEGER) * 4),h.help_topic_id這是一個遊標,所以不能進行法則運算,必須轉化為有符號的資料型別。

select SUBSTRING_INDEX(SUBSTRING_INDEX(t.name,',',-(length(t.name) - length(REPLACE(t.name, ',', '')) + 1)+(cast(h.help_topic_id as SIGNED INTEGER) * 4)),',','4') from substring_index_test t join  
mysql.help_topic h  
on h.help_topic_id < ceil((length(t.name) - length(REPLACE(t.name, ',', '')) + 1)/4);

結果:


如果我想變成一個每條3個數據的怎麼辦?那我們就用儲存過程來實現,設定一個變數x,如下:

DELIMITER //
 CREATE PROCEDURE substring_index_test(in x INT)
   BEGIN
   select SUBSTRING_INDEX(SUBSTRING_INDEX(t.name,',',-(length(t.name) - length(REPLACE(t.name, ',', '')) + 1)+(CONVERT(h.help_topic_id, SIGNED INTEGER) * x)),',',x) from substring_index_test t join  
mysql.help_topic h  
on h.help_topic_id < ceil((length(t.name) - length(REPLACE(t.name, ',', '')) + 1)/x);
   END //
DELIMITER ;

有什麼問題,歡迎交流。