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)
B)。(:index = 1 or :index = 2) AND (DateEx >= :pDat1)

ですA OR B


2番目はあまり明白ではありません。

で区切られた2つの部分で構成されてい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))
于 2012-06-22T15:19:49.557 に答える
1

最初の条件を次のように書き換えることができます。

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

2 番目の条件は次のように書き換えることができます。

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

2 番目の条件を次のように縮小できることは明らかです。

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

したがって、違いは、最初のクエリは :index = 0 の場合を処理し、2 番目のクエリは :index = 1 または :index = 2 の場合にのみ機能することです。

于 2012-06-23T06:51:57.260 に答える