如果输入数据损坏,是否有办法处理SQL强制转换?SQL Server - 将无效值转换为int
比方说,我有一列数据类型NVarchar(10)
,并且希望将此列转换为int
。
我们还要说一些nvarchar
值已损坏,因此它们不能转换为int
。
有什么办法可以默默地忽略这些,默认他们为0或某些这样的?
如果输入数据损坏,是否有办法处理SQL强制转换?SQL Server - 将无效值转换为int
比方说,我有一列数据类型NVarchar(10)
,并且希望将此列转换为int
。
我们还要说一些nvarchar
值已损坏,因此它们不能转换为int
。
有什么办法可以默默地忽略这些,默认他们为0或某些这样的?
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
'Isnumeric()'函数不会起作用,因为它将为其他一些不是数字的字符返回true。这是[demo](http://sqlfiddle.com/#!6/d41d8/13171)和[MSDN](http://technet.microsoft.com/en-us/library/ms186272.aspx)链接更多详情 – Kaf
'ISNUMERIC'大部分是有用的,但请记住某些值不会被函数捕获。有时候,例如,即使我们不想要这些值,你也会在中间获得带有“e”的值。 – user123
是的我会提到这一点,就好像你在你的值中有'e',它将它看作是那个整数的功率。 '222e2'被视为222^2 –
尝试对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
我将是不受欢迎的一个,并建议REGEX
因为ISNUMERIC
,而有时是有用的,不赶一切。 This answer on SO出色介绍了一些正则表达式的概念,例如:
一个数字位数
也许是一束最简单的一个:
WHERE Column LIKE '[0-9]'
有关详细信息,这里有一个useful REGEX workbench通过Phil Factor和Robyn Pae。
SQL Server ** 2012 **现在具有“TRY_PARSE”,“TRY_CAST”和“TRY_CONVERT”功能,它们完全符合您的需求。但那些只在** 2012 **(和更新版本)中。 –
有没有回退?例如不知怎的,一个与数字匹配的案例? –