什么';这些SQL条件之间的区别是什么?

什么';这些SQL条件之间的区别是什么?,sql,firebird,Sql,Firebird,及 第一个示例实现了OR条件 以下情况也是如此…… A) (:index=0)和(DateEx介于:pDat1和:pDate2之间) B) (:index=1或:index=2)和(DateEx>=:pDat1) 它是A或B 第二个不太明显 它有两个部分,分别是和。但是它在第一个版本中的A中有一个额外的ELSE 如果以下两项均为真,则为真… A) (:index=0)和(DateEx介于:pDat1和:pDat2之间)或(:index 0) B) (:index=1或:index=2)和(Da


第一个示例实现了OR条件

以下情况也是如此……
A) <代码>(:index=0)和(DateEx介于:pDat1和:pDate2之间)
B) <代码>(:index=1或:index=2)和(DateEx>=:pDat1)

它是
A或B


第二个不太明显

它有两个部分,分别是
。但是它在第一个版本中的
A
中有一个额外的
ELSE

如果以下两项均为真,则为真…
A)
(:index=0)和(DateEx介于:pDat1和:pDat2之间)或(:index 0)

B)
(:index=1或:index=2)和(DateEx>=:pDat1)

但这有点不正确。因为如果
:index=0
,那么
B
永远不可能是真的


事实上,您根本不需要任何
CASE
语句,只需使用这个

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

第一个示例实现了OR条件

以下情况也是如此……
A) <代码>(:index=0)和(DateEx介于:pDat1和:pDate2之间)

B) <代码>(:index=1或:index=2)和(DateEx>=:pDat1)

它是
A或B


第二个不太明显

它有两个部分,分别是
。但是它在第一个版本中的
A
中有一个额外的
ELSE

如果以下两项均为真,则为真…
A)
(:index=0)和(DateEx介于:pDat1和:pDat2之间)或(:index 0)

B)
(:index=1或:index=2)和(DateEx>=:pDat1)

但这有点不正确。因为如果
:index=0
,那么
B
永远不可能是真的


事实上,您根本不需要任何
CASE
语句,只需使用这个

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

您可以重写第一个条件:

WHERE
  ((:index = 0)               AND (DateEx Between :pDat1 and :pDate2))
  OR
  ((:index = 1 or :index = 2) AND (DateEx >= :pDat1))
第二个条件可以重写:

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

因此,区别在于第一个查询处理的是:index=0的情况,第二个查询只适用于:index=1或:index=2。

您可以重写第一个条件:

WHERE
  ((:index = 0)               AND (DateEx Between :pDat1 and :pDate2))
  OR
  ((:index = 1 or :index = 2) AND (DateEx >= :pDat1))
第二个条件可以重写:

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

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

我删除了我的答案,因为我误读了案例陈述。第一个查询的意图更为明确。而且,非常重要的是,第一个查询只适用于“中间者”案例。第二个案例在这种情况下不起作用。你真的不应该在
之间使用
(几乎永远都不应该,但特别是日期)。这涉及到一些困难/奇怪的情况,特别是如果你处理时间戳的话。最好使用“下限包容,上限排斥”的心态(即,
DateEx>=:pDat1和DateEx
,其中
pDat2
已被适当调整/计算)。X-Zero,我真的不同意你从不使用“between”的建议。如果你了解它的工作原理,这是完美的。此外,日期类型没有问题。时间戳可能是“棘手的”在任何条件中。@WarmBooter-如果他不能分辨这两个语句之间的区别,可以说他不知道
之间的
也有什么作用。在第一个示例中,两个When语句中只有一个必须通过。在第二个示例中,两个When语句都必须通过。一个有一个,另一个没有。我删除了我的答案since我误读了案例陈述。第一个案例的意图更为明确。而且,非常重要的是,第一个案例仅适用于“中间”案例。第二个案例在这种情况下不起作用。你真的不应该在两个案例之间使用
(几乎永远都不应该,尤其是日期)。这涉及到一些困难/奇怪的情况,尤其是当你处理时间戳时。最好使用“下限包含,上限独占”的思维方式(即,
DateEx>=:pDat1和DateEx
,其中
pDat2
已经过适当的调整/计算).X-Zero,我真的不同意你从不使用“介于之间”的建议。如果你了解它的工作原理,这是完美的。而且,日期类型没有问题。时间戳可能是“棘手的”在任何条件中。@WarmBooter-如果他不能分辨这两个语句之间的区别,可以说他不知道
之间的
也有什么作用。在第一个示例中,两个When语句中只有一个必须通过。在第二个示例中,两个When语句都必须通过。一个有一个,另一个没有。