使用CASE时将数据类型varchar转换为数字时出错

时间:2015-07-06 16:59:10

标签: sql-server sql-server-2012

SELECT ID,
CASE WHEN ISNUMERIC(COL_VALUE) = 1 THEN CONVERT(NUMERIC, COL_VALUE) * 1000
  ELSE COL_VALUE 
END AS [COL_VALUE]
FROM Table

原始数据类型为varchar,这就是我将COL_VALUE转换为numeric的原因。 ELSE statement似乎有问题,当我执行不带ELSE statement的查询时,non-numeric值将变为NULL。我检查列是否为数字,如果是数字,则乘以1000,如果不是数字,则返回原始值。很少有非数字值,如:

23`, 34/, 34=4.

2 个答案:

答案 0 :(得分:4)

由于您要返回数字和非数字值,因此您应将所有内容转换回varchar。还可以使用try_cast函数,因为isnumeric函数在您的字符串中包含美元符号时有时会返回true,并且convert函数将失败:

SELECT ID,
       CASE WHEN TRY_CAST(COL_VALUE AS NUMERIC) IS NOT NULL 
            THEN CAST(CAST(COL_VALUE AS NUMERIC) * 1000 AS VARCHAR(100))
            ELSE COL_VALUE 
       END AS [COL_VALUE]
FROM Table

答案 1 :(得分:1)

尝试此查询

SELECT ID,
CASE WHEN ISNUMERIC(COL_VALUE) = 1 THEN Convert(varchar(50), CONVERT(NUMERIC, COL_VALUE) * 1000)
  ELSE COL_VALUE 
END AS [COL_VALUE]
FROM Table