SQL CASE WHEN语句将数值0转换为文本'000'的实现问题
问题根因
SQL Server存在数据类型优先级规则,当CASE语句的不同返回分支数据类型不一致时,系统会自动向优先级更高的类型做隐式转换。你的CASE语句中一个分支返回字符串类型的'000',另一个分支返回数值类型的copay*100计算结果,由于数值类型优先级高于字符串,'000'会被隐式转换为数值0,最终整个返回列的类型为数值,自然无法展示前导零。
解决方法
你需要将两个分支的返回值统一转换为字符串类型,避免隐式类型转换:
方案1:统一返回3位长度字符串(含前导零)
如果要求所有结果都是3位格式,比如5转为'005'、12转为'012',可使用以下代码:
SELECT CASE WHEN table1.copay * 100 = 0 THEN '000' ELSE RIGHT('000' + CAST(CAST(table1.copay * 100 AS INT) AS VARCHAR(3)), 3) END AS copay FROM table1
- 说明:
- 先将
copay*100的计算结果转为整数,再转为字符串,避免出现多余小数位 - 用
RIGHT函数补前导零,保证所有返回结果长度一致,和'000'的格式对齐
- 先将
方案2:仅0值返回'000',其他值正常展示
如果只要求0值显示为'000',其他非0值不需要补前导零,可使用以下代码:
SELECT CASE WHEN table1.copay * 100 = 0 THEN '000' ELSE CAST(table1.copay * 100 AS VARCHAR(10)) END AS copay FROM table1
内容的提问来源于stack exchange,提问作者Freonthewhite
相关产品推荐
相关产品推荐

