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

Yin*_*ing 2 sql sql-server numbers sql-server-2014

我正在使用一个包含varchar的列的视图,该列可以具有类似8.60V或的值NULL.

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

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

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

我希望它返回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

Gor*_*off 6

case表达式返回单个值.该值有一种类型.你的case表达式返回一个数字和一个字符串.该数字优先,因此SQL Server尝试将字符串转换为数字.

因此,你的错误.

您可以通过省略'V'并使用NULL以下方法解决此问题:

SELECT (CASE WHEN ISNUMERIC('V') = 1
             THEN cast(round('V', 1) as numeric(4,1))
             ELSE NULL
        END) as Value;
Run Code Online (Sandbox Code Playgroud)

或者,更简单:

SELECT TRY_CONVERT(numeric(4, 1), 'V')
Run Code Online (Sandbox Code Playgroud)

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