SQL查询varchar转numeric及后续类型转换错误如何解决?
问题根因
- 首次报错:
IIF函数要求两个返回分支的数值类型兼容。你返回的第一个分支是数值类型的DAYSS,第二个分支是字符串类型的'Out of Stock',数据库会尝试隐式将字符串转换为数值,转换失败触发converting data type varchar to numeric报错。 - 二次报错:
ISNUMERIC()函数的返回值只有1(可转换为数值)和0(不可转换为数值),你写的>=0判断永远为真,同时你直接用字符串类型存储的DAYSS和数值1比较时,数据库会尝试将带小数的字符串'7.350000'隐式转换为int类型,转换失败触发报错。
解决方案
核心逻辑是统一两个返回分支的类型,全部转为字符串即可,根据DAYSS的实际字段类型选择对应写法:
- 如果
DAYSS本身是数值类型(decimal/float等),直接转换符合条件的值为字符串:
SELECT * , IIF(DAYSS >= 1, CAST(DAYSS AS VARCHAR(20)), 'Out of Stock') AS NEWDA FROM TABLE3
如果数据库不支持IIF语法,可改用CASE语句改写:
SELECT * , CASE WHEN DAYSS >= 1 THEN CAST(DAYSS AS VARCHAR(20)) ELSE 'Out of Stock' END AS NEWDA FROM TABLE3
- 如果
DAYSS是字符串类型存储的数值,先转成decimal做判断再转字符串:
SELECT * , CASE WHEN ISNUMERIC(DAYSS) = 1 AND CAST(DAYSS AS DECIMAL(18,6)) >= 1 THEN CAST(CAST(DAYSS AS DECIMAL(18,6)) AS VARCHAR(20)) ELSE 'Out of Stock' END AS NEWDA FROM TABLE3
如果需要控制返回的小数位数、去掉末尾多余的0,可以用FORMAT、ROUND等函数对转换后的数值做格式化处理后再转字符串即可。
内容的提问来源于stack exchange,提问作者user16290409
相关产品推荐
相关产品推荐

