将nvarchar转换为int时转换失败

3

我有一个字段是varchar类型的,包含数字和日期字符串。我想更新该字段中所有大于720的数字。我首先尝试进行选择,但是出现了以下错误:

Conversion failed when converting the nvarchar value '16:00' to data type int.

这是我的查询:

select id, case(isnumeric([other08])) when 1 then [other08] else 0 end
from CER where sourcecode like 'ANE%' --and other08 > 720

当我取消最后一部分的注释时,它会失败。

我正在尝试获取所有大于720的数字,但我无法进行比较。在强制转换和转换时也会失败。

感谢任何帮助

2个回答

7

您还需要在WHERE子句中执行检查和转换:

SELECT 
       id, 
       CASE WHEN isnumeric([other08]) = 1 THEN CAST([other08] AS INT) ELSE 0 END
FROM   CER 
WHERE  sourcecode LIKE 'ANE%' 
AND CASE WHEN isnumeric([other08]) = 1 THEN CAST([other08] AS INT) ELSE 0 END > 720

查询语法不正确,但你的逻辑是无懈可击的。它对我非常有效! - Abs
1
@Abs - 草率回答的危险。已更新为正确语法。 - Winston Smith

2

您需要在where子句中使用IsNumeric,以避免尝试将字符串与数字720进行比较。例如:

select id, case(isnumeric([other08])) when 1 then [other08] else 0 end
from CER 
where sourcecode like 'ANE%' and ISNUMERIC(other08) = 1 and other08 > 720

编辑

正如@Abs所指出的那样,上述方法行不通。我们可以使用CTE计算一个可靠的字段来过滤,然而:

WITH Data AS (
  select id
    , case WHEN isnumeric([other08]) THEN CAST([other08] AS int) else 0 end AS FilteredOther08
    , CER.* 
  from CER 
  where sourcecode like 'ANE%'
)
SELECT *
FROM Data
WHERE [FilteredOther08] > 720

这取决于短路和SQL引擎按指定顺序评估WHERE条件。我不确定情况是否如此 - 或许有人可以澄清。 - Winston Smith
1
我认为你需要加上= 1,但这也不行,因为where条件语句仍将测试所有字段(other08)是否大于720并失败。在where子句中没有排序。我尝试过这个方法,但没成功。 - Abs
1
@Abs,你说的=1是对的,这就是我重新输入而不是复制粘贴的结果,已经进行了编辑以反映出来。你也正确指出了短路问题,但我认为使用CTE应该可以解决这个问题。 - dsolimano
+1 是的,这也可以行得通,dsolimano - 相对复杂。 - Abs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接