这些SQL条件之间有什么区别?

时间:2012-06-22 15:09:57

标签: sql firebird

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

2 个答案:

答案 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.

相关问题