T-SQL如何替换拼接多列值 将周几会议安排列合并为友好展示格式
SQL Server 2016 多工作日列合并为单列解决方案
直接使用STUFF+CONCAT+CASE组合即可实现需求,不需要声明变量处理拼接逻辑,完美兼容SQL Server 2016版本:
SELECT MEETING_TITLE, STUFF( CONCAT( CASE WHEN MONDAY = 'Y' THEN '/M' END, CASE WHEN TUESDAY = 'Y' THEN '/T' END, CASE WHEN WEDNESDAY = 'Y' THEN '/W' END, CASE WHEN THURSDAY = 'Y' THEN '/THU' END, CASE WHEN FRIDAY = 'Y' THEN '/F' END ), 1, 1, '') AS MEETING_DAYS FROM SCHEDULE;
逻辑说明
- 每个CASE语句对应一个工作日的判断,符合
Y的条件返回带前缀分隔符/的缩写,不符合则返回NULL CONCAT函数会自动忽略NULL值,只会拼接符合条件的片段STUFF函数去掉拼接结果开头多余的第一个/,不会出现首尾冗余分隔符的问题
用你提供的示例数据测试,输出完全匹配预期:
| MEETING_TITLE | MEETING_DAYS |
|---|---|
| FOO | T/THU |
复杂场景扩展方案
如果实际表结构更复杂,后续需要增减工作日判断、修改缩写规则,可以用CROSS APPLY优化可维护性,避免重复写CASE逻辑:
SELECT t.MEETING_TITLE, STUFF(STRING_AGG(d.abbr, '/') WITHIN GROUP (ORDER BY d.sort), 1, 0, '') AS MEETING_DAYS FROM SCHEDULE t CROSS APPLY ( VALUES (1, CASE WHEN t.MONDAY = 'Y' THEN 'M' END), (2, CASE WHEN t.TUESDAY = 'Y' THEN 'T' END), (3, CASE WHEN t.WEDNESDAY = 'Y' THEN 'W' END), (4, CASE WHEN t.THURSDAY = 'Y' THEN 'THU' END), (5, CASE WHEN t.FRIDAY = 'Y' THEN 'F' END) ) d(sort, abbr) WHERE d.abbr IS NOT NULL GROUP BY t.MEETING_TITLE;
后续需要调整规则只需修改VALUES里的配置项即可,不需要修改外层拼接逻辑。
内容的提问来源于stack exchange,提问作者CamParker
相关产品推荐
相关产品推荐

