0
Select * from Example
where
1 = Case when :index = 0 then
         Case when DateEx Between :pDat1 and :pDate2 then 1 end
    else
         Case When :index = 1 or :index = 2 then
              Case When DateEx >= :pDat1 then 1 end
         end
    end

Select * from Example
where 
1 = Case when :index = 0 then
            Case when DateEx Between :pDat1 and :pDat2 then 1 end
    else 1
    end
and 1 = Case When :index = 1 or :index = 2 then
             Case When DateEx >= :pDat1 then 1 end
        end
4

2 回答 2

3

第一个示例实现了 OR 条件。

以下情况是正确的......
A)。(:index = 0) AND (DateEx Between :pDat1 and :pDate2)
乙)。(:index = 1 or :index = 2) AND (DateEx >= :pDat1)

A OR B


第二个不太明显。

它有两个部分,由 分隔AND。但它在第一个版本中具有额外ELSE的内容。A

如果以下两项都为真,则为真...
A) ((:index = 0) AND (DateEx Between :pDat1 and :pDat2)) OR (:index <> 0)
B)((:index = 1 or :index = 2) AND (DateEx >= :pDat1)

但这有点坏了。因为 if :index = 0, thenB永远不可能为真。


其实你根本不需要任何CASE语句,就用这个...

WHERE
  ((:index = 0)               AND (DateEx Between :pDat1 and :pDate2))
  OR
  ((:index = 1 or :index = 2) AND (DateEx >= :pDat1))
于 2012-06-22T15:19:49.557 回答
1

您可以重写第一个条件:

(:index = 0 AND DateEx BETWEEN :pDat1 AND :pDat2) 
OR 
(:index IN (1, 2) AND DateEx >= :pDat1)

第二个条件可以改写:

(:index <> 0 OR DateEx BETWEEN :pDat1 AND :pDat2) 
AND
(:index IN (1, 2) AND DateEx >= :pDat1)

显然,第二个条件可以简化为:

:index IN (1, 2) AND DateEx >= :pDat1

因此,不同之处在于第一个查询处理 :index = 0 时的情况,而第二个查询仅适用于 :index = 1 或 :index = 2。

于 2012-06-23T06:51:57.260 回答