0

在 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将首先得到评估,如果为假,则将跳过第二个条件。

看起来它不像这样工作......或者?有没有其他方法可以做到这一点?

谢谢!

4

2 回答 2

1

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

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

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

您将“保护”对“月份”的评估,而不是条件。

于 2013-04-14T09:08:52.007 回答
-1

您可以尝试将查询分成两部分。这是概念:

SELECT *
FROM (
    SELECT *
    FROM myTable
    WHERE int_date > 19500101
) t
WHERE month(CONVERT(smalldatetime, ... t.int_date))
于 2013-04-14T09:02:09.937 回答