2011-04-01 55 views
1

我已经看到类似的问题在本网站的其他地方问过,但更多的是在优化环境中。指定(T)SQL执行顺序

我遇到了在WHERE子句中执行条件的顺序问题。我有一个存储代码的字段,其中大部分都是数字,但其中一些包含非数字字符。我需要对数字代码进行一些操作,如果尝试使用非数字字符串,将导致错误。我试图做类似

WHERE isnumeric(code) = 1 
AND CAST(code AS integer) % 2 = 1 

有没有什么办法,以确保该ISNUMERIC()执行第一?如果它不,我得到一个错误...

在此先感谢!

+0

您几乎可以肯定需要在这里使用'CASE'表达式,因为SQL不允许您定义评估顺序。 – Gabe 2011-04-01 20:50:14

+0

这里的问题是SQL标准缺少[short-circuit evaluation](http://en.wikipedia.org/wiki/Short-circuit_evaluation)。事实上这很好,但这只是我的看法。 – rsenna 2011-04-01 20:54:54

回答

5

评价是保证的唯一场所秩序CASE

WHERE 
    CASE WHEN isnumeric(code) = 1 
      THEN CAST(code AS integer) % 2 
END = 1 

也只是因为它通过isnumeric测试并不能保证它会成功cast为整数。

SELECT ISNUMERIC('$') /*Returns 1*/ 

SELECT CAST('$' AS INTEGER) /*Fails*/ 

根据您的需要,您可能会发现these alternatives更可取。

0

为什么不使用CASE语句这样说:

WHERE 
CASE WHEN isnumeric(code) = 1 
THEN CAST(code AS int) % 2 = 1 
ELSE /* What ever else if not numeric */ END 
0

你能做到这一点的select子句中case声明,然后由值外select

select * from ( 
    select 
    case when isNum = 1 then CAST(code AS integer) % 2 else 0 end as castVal 
    from (
     select 
     Case when isnumeric(code) = 1 then 1 else 0 end as isNum 
     from table) t 
) t2 
where castval = 1 
1
限制

为什么不简单地使用LIKE?:

Where Code Not Like '%[^0-9]%' 

顺便说一句,无论是使用我的解决方案或使用IsNumeric,有一些边缘情况下,可能导致人们使用UDF,如1,234,567其中IsNumeric将返回1但演员将抛出一个异常。