指定(T)SQL执行的顺序

时间:2011-04-01 20:46:46

标签: sql tsql where

我在本网站的其他地方看到了类似的问题,但在优化的背景下更多。

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

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

有没有办法确保isnumeric()先执行?如果没有,我收到错误......

提前致谢!

4 个答案:

答案 0 :(得分: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更为可取。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

为什么不使用CASE语句来说出类似的内容:

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

答案 3 :(得分:0)

您可以在case子句中的select语句中执行此操作,然后使用外部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