替代依赖SQL'where'子句中的条件的执行顺序

时间:2013-04-14 08:59:39

标签: sql sql-server-2000

在JavaScript等语言中,您可以拥有2个条件语句,并使用第一个条件语句“保护”第二个条件语句。例如:

if( scarryObject != null && scarryObject.scarryMethod() ) { ... }
// if scarryObject is null scarryMethod will not be called

我以为我会在SQL中实现同样的目标:

where int_date > 19500101
    and month(CONVERT(smalldatetime, ... int_date))

这里的问题是,如果int_date是一些“坏”值,如-1,0,1,则转换将失败,sp将因错误而停止。我认为第一次检查int_date > 19500101将首先进行评估,如果为假,则会跳过第二种情况。

看起来它不像这样......或者?还有其他方法吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

您的查询在语法上不正确,因为子句month(CONVERT....不是条件。

假设您想要与某个数字进行比较,表达您想要的可能方式

SELECT *
FROM   myTable
WHERE  case 
       when int_date > 19500101 
         then -1 
         else month(CONVERT(smalldatetime, ... int_date))
       end = @YourMonth

你会'保护'对'月'的评价,而不是条件。

答案 1 :(得分:-1)

您可以尝试将查询拆分为两个。这是概念:

SELECT *
FROM (
    SELECT *
    FROM myTable
    WHERE int_date > 19500101
) t
WHERE month(CONVERT(smalldatetime, ... t.int_date))