子查询结果的转换失败

Luc*_*man 1 sql-server-2008 sql-server cast

我有点不高兴,我必须对数据质量很差的数据库执行查询。我正在尝试评估一个包含日期但被定义为nvarchar. 我以为我可以将值转换为整数,但这失败了,因为日期字段中也有非日期值(随机字母和符号等)。

我决定做的事情如下:

SELECT q.foo, cast( q.bar as int) 
FROM ( SELECT foo,bar FROM table where ISNUMERIC(bar) = 1) as q 
WHERE q.bar > 20140401
Run Code Online (Sandbox Code Playgroud)

但这仍然会导致 nvarchar 值的转换失败'. '。我希望所有值都可以转换为 int,因为它们是数字?

Dan*_*her 6

您可以将 CASE 包装在 CAST() 中,因此 CAST() 仅对有效数值执行 - 除非您将 ELSE 放在某处,否则其他数值将导致 NULL。

此外,您的转换错误可能源于 WHERE 子句,其中 q.bar 隐式转换为 int 以便将其与 20140401 (这是一个 int)进行比较。

这可能会解决您的问题:

SELECT q.foo, CAST((CASE WHEN q.bar NOT LIKE '%[^0-9]%' THEN q.bar END) AS int) 
FROM ( SELECT foo,bar FROM table) as q 
WHERE q.bar > '20140401';
Run Code Online (Sandbox Code Playgroud)