You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 17:52:01