如果输入数据损坏,有没有办法处理SQL强制转换?
假设我有一列数据类型NVarchar(10)
,并希望将此列投射到int
。
我们还要说某些nvarchar
值已损坏,因此无法将其转换为int
。
有没有办法静默忽略这些,默认为0或其他一些?
答案 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。