2010-11-10 194 views
3

时,我有一个字段是VARCHAR,包含数字和日期为字符串。我想更新在这一领域大于720我试图首先做一个选择的所有电话号码,但我得到这个错误:转换失败转换为nvarchar成int

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,但我不能做comaprison。它在投射和转换时也失败。

感谢所有的帮助

回答

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 
+0

查询在语法上不正确的,但你的逻辑是完美无瑕的。它对我很好! – Abs 2010-11-10 15:01:51

+1

@Abs - 匆忙输入答案的危险。用正确的语法更新。 – 2010-11-11 09:14:05

2

您需要使用您的则IsNumeric where子句中,以避免试图字符串比较数量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 
+0

这依赖于短路,并SQL引擎按指定的顺序评估WHERE条件。我不确定是否是这种情况 - 也许有人可以澄清。 – 2010-11-10 14:42:43

+1

我想你需要一个'= 1' - 但这不会工作,要么因为那里条件仍然会测试所有字段(other08)是否大于720和失败。 Where子句中没有排序。我试过这个,但它对我没有用。 – Abs 2010-11-10 14:44:02

+1

@Abs,你是正确的= 1,这就是我得到重新输入,而不是复制,编辑,以反映。你还对短路问题是正确的,但我认为应该CTE解决这个问题 – dsolimano 2010-11-10 14:51:51

相关问题