2012-06-22 3 views
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 

ИВ чем разница между этими условиями SQL?

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

Я удалил свой ответ, так как неправильно истолковал утверждения дела. Первый из них более ясен в своем намерении. И, что очень важно, первый работает только с «между» случаем. В этом случае второй не работает. –

+0

Вы действительно не должны использовать 'BETWEEN' (почти всегда, но особенно с датами). Существуют трудности/странные угловые случаи, особенно если вы когда-либо занимались отметками времени. Гораздо лучше использовать «нижнюю границу включительно, верхнюю границу эксклюзивного» менталитета (то есть «DateEx> =: pDat1 AND DateEx

+0

X-Zero, я действительно не согласен с вашим обещанием никогда не использовать «между». Это прекрасно, если вы понимаете, как это работает. Кроме того, нет проблем с типом DATE. TIMESTAMP может быть «сложным» в любых условностях. – WarmBooter

ответ

3

Первый пример реализует условие ИЛИ.

Это справедливо для следующих случаев ...
A). (: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

Вы можете переписать первое условие:

(: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 

Таким образом, разница в том, что первые сделки запросов с ситуацией, когда: индекс = 0, а второй работает только для: индекс = 1 OR: index = 2.

Смежные вопросы