MySQL中列值分割的幾種方法
版本:MySQL 8.x
MySQL 沒(méi)有 split() 這樣的函數(shù),但可以用 SUBSTRING_INDEX 或 JSON_TABLE 實(shí)現(xiàn)“按分隔符拆列”。
下面給出 官方推薦 + 實(shí)戰(zhàn)寫(xiě)法,每個(gè)都能直接復(fù)制運(yùn)行。
1. 核心函數(shù)速覽
函數(shù) | 作用一句話 | 語(yǔ)法 |
---|---|---|
SUBSTRING_INDEX(str, delim, n) | 返回第 n 個(gè)分隔符前/后的子串 | SUBSTRING_INDEX('a,b,c',',',2) → ‘a,b’ |
JSON_TABLE(json, path COLUMNS(…)) | 把 JSON 數(shù)組拆成行 | 見(jiàn)案例 4 |
REGEXP_SUBSTR / REGEXP_REPLACE | 正則切分/替換 | MySQL 8 支持,見(jiàn)案例 5 |
2. 案例實(shí)驗(yàn)室
準(zhǔn)備一張表:
CREATE TABLE orders ( id INT PRIMARY KEY, items VARCHAR(100) -- 用逗號(hào)分隔的商品串 ); INSERT INTO orders VALUES (1,'蘋(píng)果,香蕉,橙子'), (2,'芒果'), (3,'桃子,葡萄'), (4,'');
案例 1 SUBSTRING_INDEX 取第 1、2、3 個(gè)元素
SELECT id, SUBSTRING_INDEX(items, ',', 1) AS item1, SUBSTRING_INDEX(SUBSTRING_INDEX(items, ',', 2), ',', -1) AS item2, SUBSTRING_INDEX(items, ',', -1) AS item_last FROM orders;
id | item1 | item2 | item_last |
---|---|---|---|
1 | 蘋(píng)果 | 香蕉 | 橙子 |
2 | 芒果 | 芒果 | 芒果 |
3 | 桃子 | 葡萄 | 葡萄 |
4 |
案例 2 一行變多行(數(shù)字表法)
用遞歸數(shù)字表(MySQL 8 CTE)把任意長(zhǎng)度的逗號(hào)串拆成行。
WITH RECURSIVE nums(n) AS ( SELECT 1 UNION ALL SELECT n+1 FROM nums WHERE n<20 ) SELECT o.id, o.items, TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(o.items, ',', n), ',', -1)) AS item FROM orders o JOIN nums ON n <= 1 + LENGTH(o.items) - LENGTH(REPLACE(o.items, ',', ''));
結(jié)果
id | items | item |
---|---|---|
1 | 蘋(píng)果,香蕉,橙子 | 蘋(píng)果 |
1 | 蘋(píng)果,香蕉,橙子 | 香蕉 |
1 | 蘋(píng)果,香蕉,橙子 | 橙子 |
2 | 芒果 | 芒果 |
3 | 桃子,葡萄 | 桃子 |
3 | 桃子,葡萄 | 葡萄 |
案例 3 JSON_TABLE(8.0 最優(yōu)雅)
把逗號(hào)串先轉(zhuǎn)成 JSON,再拆成行。
SELECT o.id, t.item FROM orders o, JSON_TABLE( CONCAT('["', REPLACE(items, ',', '","'), '"]'), -- 變成 ["蘋(píng)果","香蕉","橙子"] "$[*]" COLUMNS(item VARCHAR(20) PATH "$") ) AS t;
結(jié)果與案例 2 完全一致,但寫(xiě)法更短更清晰。
案例 4 正則切分(REGEXP_SUBSTR)
按任意正則分隔符拆列。
SELECT id, REGEXP_SUBSTR(items, '[^,]+', 1, 1) AS item1, REGEXP_SUBSTR(items, '[^,]+', 1, 2) AS item2, REGEXP_SUBSTR(items, '[^,]+', 1, 3) AS item3 FROM orders;
id | item1 | item2 | item3 |
---|---|---|---|
1 | 蘋(píng)果 | 香蕉 | 橙子 |
2 | 芒果 | NULL | NULL |
3 | 桃子 | 葡萄 | NULL |
4 | NULL | NULL | NULL |
3. 課堂小結(jié)
場(chǎng)景 | 推薦方案 |
---|---|
已知固定位置 | SUBSTRING_INDEX 一步到位 |
任意長(zhǎng)度串 → 行 | 遞歸 CTE + SUBSTRING_INDEX |
MySQL 8.0 | JSON_TABLE 最優(yōu)雅 |
復(fù)雜正則 | REGEXP_SUBSTR / REGEXP_REPLACE |
到此這篇關(guān)于MySQL中列值分割的幾種方法的文章就介紹到這了,更多相關(guān)MySQL 列值分割內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
遠(yuǎn)程連接mysql數(shù)據(jù)庫(kù)注意事項(xiàng)記錄(遠(yuǎn)程連接慢skip-name-resolve)
有時(shí)候我們需要遠(yuǎn)程連接mysql數(shù)據(jù)庫(kù),就需要注意下面的問(wèn)題,方便大家解決,腳本之家小編特為大家準(zhǔn)備了一些資料2012-07-07MySQL 數(shù)據(jù)庫(kù)兩臺(tái)主機(jī)同步實(shí)戰(zhàn)(linux)
MySQL支持單向、異步復(fù)制,復(fù)制過(guò)程中一個(gè)服務(wù)器充當(dāng)主服務(wù)器,而一個(gè)或多個(gè)其它服務(wù)器充當(dāng)從服務(wù)器。主服務(wù)器將更新寫(xiě)入二進(jìn)制日志文件,并維護(hù)日志文件的一個(gè)索引以跟蹤日志循環(huán)。2009-04-04mysql中數(shù)據(jù)庫(kù)覆蓋導(dǎo)入的幾種方式總結(jié)
這篇文章主要介紹了mysql中數(shù)據(jù)庫(kù)覆蓋導(dǎo)入的幾種方式總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03MySQL如何基于Explain關(guān)鍵字優(yōu)化索引功能
這篇文章主要介紹了MySQL如何基于Explain關(guān)鍵字優(yōu)化索引功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10MySQL運(yùn)算符!=和<>及=和<=>的使用區(qū)別
本文主要介紹了MySQL運(yùn)算符!=和<>及=和<=>的使用區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05簡(jiǎn)述MySQL分片中快速數(shù)據(jù)遷移
這篇文章主要介紹了MySQL分片中快速數(shù)據(jù)遷移的相關(guān)資料,需要的朋友可以參考下2016-03-03重置MySQL中表中自增列的初始值的實(shí)現(xiàn)方法
這篇文章主要介紹了重置MySQL中表中自增列的初始值的實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下2017-03-03