当字段为数字时转换为数字

Cast as numeric when field isnumeric

我正在使用一个视图,其中的列包含一个 varchar,它的值可以类似于 8.60VNULL.

我正在尝试创建一个 select 语句,在可能的情况下将值转换为数字,否则 return 原始值。

所以我想出了这个测试查询:

SELECT 
CASE 
    WHEN ISNUMERIC('V') = 1
        THEN cast(round('V', 1) as numeric(4,1))
        ELSE 'V'
    END
    as Value;

我希望它 return V,但我收到一个错误:Error converting data type varchar to numeric. 我试过 TRY_PARSETRY_CAST 以及 roundcast 都没有成功。错误似乎与 THEN 子句有关,因为没有,它不会引发错误。

我该如何写这个查询?

SQL 版本: Microsoft SQL Server 2014 (SP2-GDR) (KB4019093) - 12.0.5207.0 (X64)

使用:Microsoft SQL Server Management Studio v12.0.2000.8

一个case表达式returns一个单一的值。该值具有单一类型。您的 case 表达式同时返回数字和字符串。数字优先,因此 SQL 服务器尝试将字符串转换为数字。

因此,你的错误。

您可以通过放弃 'V' 并仅使用 NULL:

来解决此问题
SELECT (CASE WHEN ISNUMERIC('V') = 1
             THEN cast(round('V', 1) as numeric(4,1))
             ELSE NULL
        END) as Value;

或者,更简单地说:

SELECT TRY_CONVERT(numeric(4, 1), 'V')

注意:我假设您打算 'V' 作为示例字符串值而不是列。如果是一列,单引号就错了。

一个 case 表达式不能 return 多种数据类型。 SQL 服务器必须将所有分支的结果转换为一种数据类型。根据数据类型优先规则 numericvarchar 具有更高的优先级,因此它将 v 转换为数字。不过,您可以将数值转换为 varchar。

话虽如此,我不鼓励使用 ISNUMERIC,因为它 return 对于 $- 等无意义的值是正确的。按照其他答案中的建议使用 TRY_CAST

SELECT CASE
    WHEN TRY_CAST(v AS NUMERIC(4, 1)) IS NOT NULL THEN
        CAST(CAST(v AS NUMERIC(4, 1)) AS VARCHAR(100)) -- cast will round as well
    ELSE v
END