SQL Server - 将无效值转换为int

时间:2013-12-22 11:35:12

标签: sql-server tsql casting

如果输入数据损坏,有没有办法处理SQL强制转换?

假设我有一列数据类型NVarchar(10),并希望将此列投射到int

我们还要说某些nvarchar值已损坏,因此无法将其转换为int

有没有办法静默忽略这些,默认为0或其他一些?

3 个答案:

答案 0 :(得分:5)

DECLARE @t TABLE (Numbers VARCHAR(20))
INSERT INTO @t
VALUES
('30a'),('30'),('100'),
('100a'),('200'),('200a')

SELECT CASE 
         WHEN ISNUMERIC(Numbers) = 1 
          THEN CAST(Numbers AS INT) ELSE NULL END AS Number
FROM @t

ISNUMERIC函数返回1,当它是一个整数值时,你可以使用这个函数。

<强>结果

Number
NULL
30
100
NULL
200
NULL

它会投射integer values to INT and ignore the values that cannot be cast to Int

答案 1 :(得分:4)

使用PatIndex()函数尝试此操作:

select id, val
from t
where  patindex('%[^0-9]%',val) = 0

注意:上面的查询会过滤掉损坏的值,如果您需要使用0值,请使用case expression,如下所示。

select id, case when patindex('%[^0-9]%',val) = 0 
                then convert(int, val) 
           else 0 end val
from t 

<强> Fiddle demo for both queries

答案 2 :(得分:2)

我将成为不受欢迎的人并建议REGEX,因为ISNUMERIC虽然有时很有用,却无法捕捉到所有内容。 This answer on SO极好地涵盖了一些REGEX概念,例如:

  

一个数字

     

可能是最简单的一群:

WHERE Column LIKE '[0-9]'

有关详细信息,请参阅Phil Factor和Robyn Pae的useful REGEX workbench