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 ;
有什麼問題,歡迎交流。