Where子句取决于变量的值

时间:2014-10-07 20:35:47

标签: sql sql-server tsql case where

我有2个字段要在WHERE语句中发送值。

  • 如果变量= 0,则将2个字段值设置为100。
  • 如果变量= 1,则将相同的2个字段值设置为101。

在我想象的世界中,不知怎的,这会起作用:

Where CASE WHEN @ReportType = 0 THEN 
    od.StatusCd = 100 AND odm.StatusCd = 100
WHEN @ReportType = 1 THEN 
    od.statusCd = 101 AND odm.StatusCd = 101
End
And od.CompletionDate between ....
And so on....

我知道这是错的。但这就是我现在所处的位置。

3 个答案:

答案 0 :(得分:9)

如果我已经明白你要做什么,这应该有效:

Where 
(
(@ReportType = 0 AND od.StatusCd = 100 AND odm.StatusCd = 100)
OR
(@ReportType = 1 AND od.statusCd = 101 AND odm.StatusCd = 101)
)
And od.CompletionDate between ....
And so on....

答案 1 :(得分:1)

或者,您可以以联接的形式重写CASE条件,如下所示:

...
INNER JOIN
  (
    VALUES (0, 100, 100), (1, 101, 101)
  ) AS v (ReportType, odStatusCd, odmStatusCd)
ON
  @ReportType = v.ReportType
  AND od.statusCd = v.odStatusCd
  AND odm.StatusCd = v.odmStatusCd
WHERE
  od.CompletionDate between ...
  AND ...

虽然可读性稍差,但这样可以避免使用OR,从而可能导致更好(更有效)的执行计划。 (你需要测试一下。)

答案 2 :(得分:0)

您也可以这样做

WHERE od.StatusCd = 100 + @ReportType AND odm.StatusCd = 100 + @ReportType

或者您可以使用以下值声明一个新变量:

DECLARE @StatusCd = 100 + @ReportType

保持简单。