2013-12-22 82 views
3

如果输入数据损坏,是否有办法处理SQL强制转换?SQL Server - 将无效值转换为int

比方说,我有一列数据类型NVarchar(10),并且希望将此列转换为int

我们还要说一些nvarchar值已损坏,因此它们不能转换为int

有什么办法可以默默地忽略这些,默认他们为0或某些这样的?

+2

SQL Server ** 2012 **现在具有“TRY_PARSE”,“TRY_CAST”和“TRY_CONVERT”功能,它们完全符合您的需求。但那些只在** 2012 **(和更新版本)中。 –

+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

+0

'Isnumeric()'函数不会起作用,因为它将为其他一些不是数字的字符返回true。这是[demo](http://sqlfiddle.com/#!6/d41d8/13171)和[MSDN](http://technet.microsoft.com/en-us/library/ms186272.aspx)链接更多详情 – Kaf

+0

'ISNUMERIC'大部分是有用的,但请记住某些值不会被函数捕获。有时候,例如,即使我们不想要这些值,你也会在中间获得带有“e”的值。 – user123

+0

是的我会提到这一点,就好像你在你的值中有'e',它将它看作是那个整数的功率。 '222e2'被视为222^2 –

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

我将是不受欢迎的一个,并建议REGEX因为ISNUMERIC,而有时是有用的,不赶一切。 This answer on SO出色介绍了一些正则表达式的概念,例如:

一个数字位数

也许是一束最简单的一个:

WHERE Column LIKE '[0-9]' 

有关详细信息,这里有一个useful REGEX workbench通过Phil Factor和Robyn Pae。