MySQL的类split方法实现
MySQL 8 使用递归 CTE 拆分字符串并去重
在 MySQL 里没有内置的 split
函数,想要把 '各省教育厅、各省人力资源和社会保障厅'
这样的字段按 顿号(、) 拆分成多行,可以借助 递归 CTE + REGEXP_SUBSTR 来实现。
示例
假设表结构如下:
CREATE TABLE dept_table (id INT AUTO_INCREMENT PRIMARY KEY,dept VARCHAR(255)
);INSERT INTO dept_table (dept) VALUES
('各省教育厅'),
('各省教育厅、各省人力资源和社会保障厅'),
('各省人力资源和社会保障厅'),
('各省发展和改革委员会、各省人力资源和社会保障局'),
('各省发展和改革委员会'),
('各省人力资源和社会保障局');
递归拆分
WITH RECURSIVE cte AS (-- 第一次取第1段SELECT id, dept,1 AS idx,REGEXP_SUBSTR(dept, '[^、]+', 1, 1) AS partFROM dept_tableUNION ALL-- 递归取第 idx+1 段SELECT id, dept,idx + 1,REGEXP_SUBSTR(dept, '[^、]+', 1, idx + 1)FROM cteWHERE REGEXP_SUBSTR(dept, '[^、]+', 1, idx + 1) IS NOT NULL
)
SELECT DISTINCT TRIM(part) AS part
FROM cte
WHERE part IS NOT NULL
ORDER BY part;
结果
各省人力资源和社会保障厅
各省人力资源和社会保障局
各省发展和改革委员会
各省教育厅
小结
REGEXP_SUBSTR(dept, '[^、]+', 1, n)
:取字符串中第 n 段。- 递归 CTE 控制 n 的增长,直到取不到新值。
- 最终用
DISTINCT
去重即可。
这种方式通用性强,不管字段里有多少个顿号,都能正确拆分。