如何让SELECT CASE查询结果仅非最后一行追加逗号?
解决方法:用行号判断控制逗号拼接
核心思路是给每行标记序号和总行数,仅在非最后一行的结果末尾追加逗号,以下分两种场景给出实现代码:
主流数据库(MySQL 8.0+/PostgreSQL/SQL Server等)
直接用窗口函数生成行号与总行数,在逻辑中动态判断是否加逗号:
SELECT CONCAT( -- 保留你原有的路径替换+文件名转大写逻辑 CASE WHEN name LIKE '%/a/%' THEN CONCAT(REPLACE(name, '/旧路径/a/', '/新路径/a2/'), UPPER(SUBSTRING_INDEX(name, '/', -1))) WHEN name LIKE '%/b/%' THEN CONCAT(REPLACE(name, '/旧路径/b/', '/新路径/b2/'), UPPER(SUBSTRING_INDEX(name, '/', -1))) -- 补全你其他的路径匹配规则 ELSE name -- 处理不匹配的异常情况 END, -- 新增逻辑:仅当前行不是最后一行时加逗号 CASE WHEN row_num < total_rows THEN ',' ELSE '' END ) AS new_path FROM ( -- 子查询生成每行序号和结果集总行数 SELECT name, ROW_NUMBER() OVER(ORDER BY name) AS row_num, -- 排序字段可换成主键或业务需要的排序规则 COUNT(*) OVER() AS total_rows FROM 你的表名 ) AS temp;
低版本MySQL(5.x,不支持窗口函数)
用用户变量实现行号计数与总行数判断:
-- 先初始化变量 SET @row_count = 0; SET @total = (SELECT COUNT(*) FROM 你的表名); SELECT CONCAT( -- 保留原有的路径替换+文件名转大写逻辑 CASE WHEN name LIKE '%/a/%' THEN CONCAT(REPLACE(name, '/旧路径/a/', '/新路径/a2/'), UPPER(SUBSTRING_INDEX(name, '/', -1))) WHEN name LIKE '%/b/%' THEN CONCAT(REPLACE(name, '/旧路径/b/', '/新路径/b2/'), UPPER(SUBSTRING_INDEX(name, '/', -1))) ELSE name END, -- 通过变量判断是否加逗号 CASE WHEN @row_count := @row_count + 1 < @total THEN ',' ELSE '' END ) AS new_path FROM 你的表名 ORDER BY name; -- 按需调整排序规则
关键注意点
- 排序字段:
ORDER BY name可替换为你的业务主键或其他排序字段,确保行顺序符合预期,避免最后一行判断错误 - 路径替换部分:将示例中的旧路径/新路径替换为你实际使用的路径,保持原有CASE匹配规则不变即可
内容的提问来源于stack exchange,提问作者RevXaisks
相关产品推荐
相关产品推荐

