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

SQL技术需求:将逗号分隔列数据拆分为单行展示

解决逗号分隔数据拆分的SQL需求

嘿,我来帮你搞定这个逗号分隔数据拆分的SQL需求~ 你的目标是根据指定的TDNO,先返回该TDNO作为第一条记录,再把对应的PREVIOUS_TD字段按逗号拆分成多条行,同时处理PREVIOUS_TD为NEW的特殊情况对吧?下面我给你分数据库给出实现方案:

方案1:MySQL 8.0+(支持递归CTE)

递归CTE是处理字符串拆分的灵活方式,我们可以用它逐步拆分逗号分隔的内容,同时生成有序的ID:

WITH RECURSIVE split_td AS (
    -- 锚点:获取目标TDNO的基础记录,生成第一行数据
    SELECT 
        TDNO AS td,
        PREVIOUS_TD AS remaining_td,
        1 AS row_id
    FROM td_table
    WHERE TDNO = 14 -- 替换成你要查询的TDNO,比如23、32、55
    UNION ALL
    -- 递归处理带多个逗号的字符串
    SELECT 
        SUBSTRING_INDEX(remaining_td, ',', 1) AS td,
        TRIM(LEADING ',' FROM SUBSTRING(remaining_td, LOCATE(',', remaining_td) + 1)) AS remaining_td,
        row_id + 1 AS row_id
    FROM split_td
    WHERE remaining_td IS NOT NULL 
        AND remaining_td != ''
        AND remaining_td != 'NEW' -- NEW不拆分
        AND LOCATE(',', remaining_td) > 0 -- 还有逗号才继续拆分
    UNION ALL
    -- 处理单个值(无逗号)的情况
    SELECT 
        remaining_td AS td,
        '' AS remaining_td,
        row_id + 1 AS row_id
    FROM split_td
    WHERE remaining_td IS NOT NULL 
        AND remaining_td != ''
        AND remaining_td != 'NEW'
        AND LOCATE(',', remaining_td) = 0
)
-- 最终整理结果,按顺序输出
SELECT row_id AS ID, td AS TD
FROM split_td
ORDER BY row_id;

效果测试:

  • 当TDNO=14时,会返回14、13、12、11四行,ID从1到4
  • 当TDNO=32时,返回32、89两行
  • 当TDNO=55时,因PREVIOUS_TD=NEW,仅返回55一行
  • 当TDNO=23时,返回23、45、12三行

方案2:SQL Server(支持STRING_SPLIT)

SQL Server有内置的STRING_SPLIT函数,拆分字符串更简单:

WITH base_data AS (
    SELECT 
        TDNO,
        PREVIOUS_TD
    FROM td_table
    WHERE TDNO = 23 -- 替换目标TDNO
)
SELECT 
    ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS ID,
    value AS TD
FROM (
    -- 先加入当前TDNO作为第一行
    SELECT TDNO AS value FROM base_data
    UNION ALL
    -- 拆分PREVIOUS_TD,排除NEW的情况
    SELECT TRIM(value) -- 处理可能的空格
    FROM base_data
    CROSS APPLY STRING_SPLIT(PREVIOUS_TD, ',')
    WHERE PREVIOUS_TD != 'NEW'
) AS combined_results
ORDER BY ID;

注意事项:

  • 如果你的数据库版本较低(比如MySQL 5.x),可以用数字表的方式拆分:先创建一个包含1到N的数字表,然后通过SUBSTRING_INDEX逐个提取每个位置的元素
  • 如果PREVIOUS_TD里有空格(比如'45, 12'),记得用TRIM()函数去除元素前后的空格,避免结果带空格

内容的提问来源于stack exchange,提问作者Rak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 07:04:49