SQL Server 2008 R2中CASE与STUFF函数结合的语法问题
解决SQL Server 2008 R2中合并字段后使用CASE语句的语法问题
这个问题我之前处理过,你遇到的报错主要是CASE语句的语法完整性和位置不对导致的,咱们来一步步修正:
首先回顾你原本用来合并一对多关系的正确语句:
contNumber = STUFF((SELECT ', ' + RTRIM(LTRIM(t.contNumber)) FROM dbContactNumbers t where d.contid = t.contid FOR XML PATH ('')), 1, 1, '')
你想要实现的是:当合并后的contNumber等于'44'时,将其置为NULL,否则保留原值。常规写法报错的原因有两个:
- CASE语句缺少必需的
END关键字 - 没有正确将整个合并后的结果作为CASE的判断对象,导致SQL解析时出现语法冲突
方案1:直接在SELECT列表中嵌套CASE(适合简单场景)
把整个STUFF合并语句作为CASE的判断和返回值,注意要补全CASE的语法:
SELECT d.contid, contNumber = CASE WHEN STUFF((SELECT ', ' + RTRIM(LTRIM(t.contNumber)) FROM dbContactNumbers t where d.contid = t.contid FOR XML PATH ('')), 1, 1, '') = '44' THEN NULL ELSE STUFF((SELECT ', ' + RTRIM(LTRIM(t.contNumber)) FROM dbContactNumbers t where d.contid = t.contid FOR XML PATH ('')), 1, 1, '') END FROM YourMainTable d; -- 替换成你的主表名称
方案2:用CTE简化重复逻辑(更优雅,推荐)
上面的写法重复了STUFF子查询,用CTE先计算出合并后的字段,再做CASE判断,可读性和性能更好:
WITH MergedContacts AS ( SELECT d.contid, -- 先计算合并后的号码 STUFF((SELECT ', ' + RTRIM(LTRIM(t.contNumber)) FROM dbContactNumbers t where d.contid = t.contid FOR XML PATH ('')), 1, 1, '') AS mergedNumber FROM YourMainTable d -- 替换成你的主表名称 ) SELECT contid, -- 对合并后的结果做CASE判断 CASE WHEN mergedNumber = '44' THEN NULL ELSE mergedNumber END AS contNumber FROM MergedContacts;
额外说明:如果需要在合并前处理单个'44'值
如果你想把单个等于'44'的号码在合并时就排除(而不是合并后判断整个字符串),可以在子查询里先处理:
contNumber = STUFF(( SELECT ', ' + RTRIM(LTRIM( -- 单个号码是'44'时替换为空字符串,避免影响合并结果 CASE WHEN t.contNumber = '44' THEN '' ELSE t.contNumber END )) FROM dbContactNumbers t where d.contid = t.contid FOR XML PATH ('') ), 1, 1, '')
这种情况下,如果某条记录只有'44'这一个号码,合并后会得到空字符串,你可以再外层加CASE把空字符串转成NULL:
contNumber = CASE WHEN STUFF(( SELECT ', ' + RTRIM(LTRIM(CASE WHEN t.contNumber = '44' THEN '' ELSE t.contNumber END)) FROM dbContactNumbers t where d.contid = t.contid FOR XML PATH ('') ), 1, 1, '') = '' THEN NULL ELSE STUFF(( SELECT ', ' + RTRIM(LTRIM(CASE WHEN t.contNumber = '44' THEN '' ELSE t.contNumber END)) FROM dbContactNumbers t where d.contid = t.contid FOR XML PATH ('') ), 1, 1, '') END
内容的提问来源于stack exchange,提问作者Syntax Error
相关产品推荐
相关产品推荐

