将Smallint与Int列拼接转换为NUMERIC时遇类型转换错误求助
问题分析与解决
错误的核心原因是CASE表达式的两个分支返回类型不统一:
- 第一个分支直接返回
ColumnA(smallint/int类型) - 第二个分支返回
CONCAT生成的字符串
SQL会自动将CASE的所有分支结果统一为优先级更高的数值类型,因此会尝试把字符串'1.1'转成int,导致转换失败。
解决方案1:统一分支返回为字符串后转数值
将第一个分支的数值也转为字符串,让CASE整体返回字符串类型,再转换为NUMERIC(2,1):
CAST(CASE WHEN ColumnA IS NOT NULL AND (ColumnB = 0 OR ColumnB IS NULL) THEN CAST(ColumnA AS VARCHAR(10)) WHEN ColumnA IS NOT NULL AND ColumnB IS NOT NULL AND ColumnB > 0 THEN CONCAT(ColumnA, '.', ColumnB) END AS NUMERIC(2, 1)) AS VERSION
解决方案2:用数值运算替代字符串拼接(更高效)
既然最终要的是x.y格式的数值,直接通过数学计算生成,全程避免字符串操作,从根源上消除类型转换问题:
CAST( CASE WHEN ColumnA IS NOT NULL AND (ColumnB = 0 OR ColumnB IS NULL) THEN ColumnA WHEN ColumnA IS NOT NULL AND ColumnB IS NOT NULL AND ColumnB > 0 THEN ColumnA + ColumnB / 10.0 END AS NUMERIC(2, 1) ) AS VERSION
注意事项
NUMERIC(2,1)的取值范围是-9.9到9.9,如果ColumnA大于9或者ColumnB大于9,会触发溢出错误,需根据实际数据调整精度(比如改为NUMERIC(3,1))。
内容的提问来源于stack exchange,提问作者GBM
相关产品推荐
相关产品推荐

