2017-10-19 5 views
0

Ich benutze Oracle 11g und ich habe eine einfache Abfrage (Bericht) mit Parametern in meiner WHERE-Klausel, aber ich bin nicht in der Lage, die OR-Operation effizient zu verwenden.SQL - Verwenden Sie OR-Operator in Parameter

Meine WHERE-Klausel ist:

WHERE 
1=1 
AND 
(
    TRUNC(SYSDATE) - TRUNC(seg.START) BETWEEN 0 AND [DaysBeforClass] 
    OR 
    TRUNC(seg.END) - TRUNC(SYSDATE) BETWEEN 0 AND [DaysAfterClass] 
) 


Bitte beachten Sie, dass:

  • seg.START und seg.END sind Datum Uhrzeit Typ
  • [DaysBeforClass] und [DaysAfterClass] sind die Parameter für den Endbenutzer (Textkasten)

Was ich brauche ist, dass der Benutzer beide Parameter gleichzeitig und einzeln verwendet.

Derzeit diese Klausel WHERE funktioniert gut, wenn:

  • der Benutzer beide Parameter verwendet gleichzeitig
  • verwendet der Benutzer nur die DaysBeforClass Parameter

Irgendwelche Ideen?

Vielen Dank für Ihre Hilfe!

+1

Gibst du 'NULL' für Benutzer nichts eingegeben? –

Antwort

0

Sie suchen einen Zustand wie dies vielleicht:

WHERE 
    ([DaysBeforClass] IS NULL OR TRUNC(seg.START) BETWEEN TRUNC(SYSDATE) - [DaysBeforClass] AND TRUNC(SYSDATE)) 
    AND 
    ([DaysAfterClass] IS NULL OR TRUNC(seg.END) BETWEEN TRUNC(SYSDATE) AND TRUNC(SYSDATE) + [DaysAfterClass]) 

ich TRUNC(seg.START) BETWEEN TRUNC(SYSDATE) - [DaysBeforClass] AND TRUNC(SYSDATE) anstelle von TRUNC(SYSDATE) - TRUNC(seg.START) BETWEEN 0 AND [DaysBeforClass] weil dann Oracle eine funktionsbasierte Index auf TRUNC(seg.START)

0

nutzen können, wenn Sie TRUNC(column_name) verwenden dann Oracle kann nicht Verwenden Sie einen Index für diese Spalte (und müsste stattdessen einen funktionsbasierten Index haben). Alternativ können Sie verwenden:

WHERE ( :DaysBeforClass IS NULL 
     OR ( seg.START >= TRUNC(SYSDATE) - :DaysBeforClass 
     AND seg.START < TRUNC(SYSDATE) + 1 
     ) 
    ) 
AND ( :DaysAfterClass IS NULL 
     OR ( seg.END >= TRUNC(SYSDATE) 
     AND seg.END < TRUNC(SYSDATE) + :DaysAfterClass + 1 
     ) 
    ) 
+0

Ich nehme an, die Frage bezieht sich mehr auf "Wie man damit umgeht, wenn' DaysBeforClass' und/oder 'DaysAfterClass' NULL ist?" –

+0

@WernfriedDomscheit Ich habe gerade das aktualisiert. – MT0

Verwandte Themen