MySQL 8.0.33提取连字符分隔文本各单词首字母问题
解决MySQL拆分连字符分隔文本并提取首字母的问题
你的问题出在SUBSTRING_INDEX(mycolumn, '-', -1)这个函数上,它只会返回最后一个以连字符分隔的片段,所以只能拿到最后一个单词的首字母。针对MySQL 8.0.33,有两种简洁的解决方法:
方法1:使用JSON_TABLE拆分(更简洁)
利用JSON_TABLE将字符串转成JSON数组后拆分为多行,再提取首字母拼接:
SELECT GROUP_CONCAT(LEFT(word, 1) SEPARATOR '') AS initials FROM mytable, JSON_TABLE( CONCAT('["', REPLACE(mycolumn, '-', '","'), '"]'), '$[*]' COLUMNS(word VARCHAR(255) PATH '$') ) AS split_words;
逻辑说明:
- 先用
REPLACE把连字符替换为",",再拼接前后的["和"],将hello-welcome-to-tutorials转成["hello","welcome","to","tutorials"]格式的JSON数组 - 用
JSON_TABLE把数组拆分成每行一个单词的结果集 - 对每个单词取首字母,最后用
GROUP_CONCAT拼接成目标字符串
方法2:使用递归CTE拆分
适合需要更灵活控制拆分逻辑的场景:
WITH RECURSIVE split_words AS ( -- 初始化:拆分第一个单词和剩余字符串 SELECT LEFT(mycolumn, LOCATE('-', mycolumn) - 1) AS word, SUBSTRING(mycolumn, LOCATE('-', mycolumn) + 1) AS remaining FROM mytable WHERE mycolumn LIKE '%-%' UNION ALL -- 递归处理剩余字符串 SELECT CASE WHEN LOCATE('-', remaining) > 0 THEN LEFT(remaining, LOCATE('-', remaining) - 1) ELSE remaining END AS word, CASE WHEN LOCATE('-', remaining) > 0 THEN SUBSTRING(remaining, LOCATE('-', remaining) + 1) ELSE '' END AS remaining FROM split_words WHERE remaining != '' -- 补充处理没有连字符的单行文本 UNION ALL SELECT mycolumn AS word, '' AS remaining FROM mytable WHERE mycolumn NOT LIKE '%-%' ) SELECT GROUP_CONCAT(LEFT(word, 1) SEPARATOR '') AS initials FROM split_words;
逻辑说明:
- 通过递归CTE逐步拆分字符串,每次取出一个单词,直到剩余字符串为空
- 最后对所有拆分出的单词取首字母并拼接
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

