SQL Server基于三类字段生成逗号分隔自定义列问题咨询
问题1原因解释
你遇到的判断异常是SQL Server隐式类型转换导致的:ISNULL函数要求两个参数类型匹配,你传入的第一个参数FLDFLOAT5是float类型,第二个参数''是字符串类型,数据库会自动将''转换为float类型,空字符串转float的结果是0。
所以ISNULL(FLDFLOAT5, '')实际等价于ISNULL(FLDFLOAT5, 0),当FLDFLOAT5取值为0时,返回值就是0。后续判断0 = ''时,数据库又会把''转成float的0,最终0=0判断为真,和你的预期不符。
问题2解决方案
SQL Server 2014没有CONCAT_WS函数,你可以通过前置逗号+STUFF移除首逗号的方式实现需求,完全符合无首尾逗号、无匹配返回空的要求。
修正后的完整查询语句如下:
SELECT FLDSTRING1, FLDFLOAT5, FLDFLOAT6, STUFF( CONCAT( CASE WHEN FLDSTRING1 IS NOT NULL AND FLDSTRING1 <> '' AND FLDSTRING1 <> '0' THEN ',NEWPROD' ELSE '' END, CASE WHEN FLDFLOAT5 = 1 THEN ',CUSTOM1' ELSE '' END, CASE WHEN FLDFLOAT6 = 1 THEN ',CUSTOM2' ELSE '' END ), 1, 1, '' ) AS TAGS FROM MATERIAL GROUP BY FLDSTRING1, FLDFLOAT5, FLDFLOAT6;
逻辑说明
- 每个符合条件的标签前统一加逗号,无匹配的分支返回空字符串
- 用
STUFF函数删除拼接后字符串的第一个字符(即多余的首逗号) - 当没有符合条件的标签时,
CONCAT返回空字符串,STUFF处理后仍返回空,符合需求
内容的提问来源于stack exchange,提问作者Faye D.
相关产品推荐
相关产品推荐

