在MySQL中,我們常常需要對字符串進行處理,比如把一個長字符串按照特定的分隔符分割成若干個短字符串,然后將這些短字符串變成豎排的形式。下面我們來介紹如何實現(xiàn)這個過程。
-- 首先我們創(chuàng)建一個測試表 CREATE TABLE test_table ( col VARCHAR(100) NOT NULL ); -- 插入一些測試數(shù)據(jù) INSERT INTO test_table (col) VALUES ('aaa,bbb,ccc'), ('1111,2222,3333,4444,5555'), ('a,b,c,d,e,f'); -- 查詢表中的全部數(shù)據(jù) SELECT * FROM test_table;
首先我們需要使用SUBSTRING_INDEX函數(shù)來實現(xiàn)分割字符串的功能,該函數(shù)的語法如下:
SUBSTRING_INDEX(str,delim,count)
其中,str表示待分割的字符串,delim表示分隔符,count表示分隔符出現(xiàn)的次數(shù)。如果count是正數(shù),函數(shù)返回結(jié)果為整個字符串中第count個分隔符左邊的子串;如果count是負數(shù),函數(shù)返回結(jié)果為整個字符串中從右往左第|count|個分隔符右邊的子串。
接下來我們將SELECT語句改寫成如下形式:
SELECT SUBSTRING_INDEX(col,',',1) AS col1, SUBSTRING_INDEX(SUBSTRING_INDEX(col,',',2),',',-1) AS col2, SUBSTRING_INDEX(SUBSTRING_INDEX(col,',',3),',',-1) AS col3, SUBSTRING_INDEX(col,',',-1) AS col4 FROM test_table;
這段代碼先將每行數(shù)據(jù)按照逗號分隔成四部分,然后使用AS子句來為每一部分起別名,便于后面的操作。注意第二個和第三個子串是嵌套使用SUBSTRING_INDEX函數(shù)的。
接下來我們需要將每行數(shù)據(jù)按照列存儲,并且將每個字段的值調(diào)整為等長的,變成豎排輸出。代碼如下:
SELECT LPAD(col1,8) AS col1, LPAD(col2,8) AS col2, LPAD(col3,8) AS col3, LPAD(col4,8) AS col4 FROM ( SELECT SUBSTRING_INDEX(col,',',1) AS col1, SUBSTRING_INDEX(SUBSTRING_INDEX(col,',',2),',',-1) AS col2, SUBSTRING_INDEX(SUBSTRING_INDEX(col,',',3),',',-1) AS col3, SUBSTRING_INDEX(col,',',-1) AS col4 FROM test_table ) AS t;
這段代碼中我們使用內(nèi)層查詢先做了分隔字符串的操作,然后使用LPAD函數(shù)將每個字段的值格式化為8位長度。外層查詢則是將每個字段的值豎排輸出。
至此,我們已經(jīng)將一個長字符串分割成若干個短字符串并將它們豎排輸出了。
下一篇MySQL分一百等分