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
相关产品推荐
相关产品推荐

