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
答案 0 :(得分:3)
第一个示例实现OR条件。
以下情况确实如此......
一个)。 (:index = 0) AND (DateEx Between :pDat1 and :pDate2)
B)。 (: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)
但这有点破碎。因为如果:index = 0
,则B
永远不会为真。
事实上,您根本不需要任何CASE
语句,只需使用此...
WHERE
((:index = 0) AND (DateEx Between :pDat1 and :pDate2))
OR
((:index = 1 or :index = 2) AND (DateEx >= :pDat1))
答案 1 :(得分: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 OR:index = 2.