2016-04-21 10 views
1

Ich möchte Parameter in meiner Abfrage verwenden, aber ich kann nicht damit umgehen damitDecode mit AND-Klausel Oracle

Ich habe 3 groß wählt raport und ich möchte nur Parameter für einen Teil des Codes verwenden, die aus hängt

Wahl

ich habe 3 verschiedene Wo Bedingungen

1.
..WHERE A.CANCELLED = 'FALSE' AND a.open_amount!=0 AND A.IDENTITY = '&client_id'..

2.

...WHERE A.CANCELLED = 'FALSE' AND A.IDENTITY = '&client_id' ... 

3.

WHERE AND A.CANCELLED = 'FALSE' AND a.invoice_amount != a.open_amount AND A.IDENTITY = '&client_id' 

Ich habe versucht, mit dekodieren, aber ich denke, es ist in Ordnung sein könnte, wenn es Wert im zweiten Fall wäre, aber es ist nicht und ich kann nicht wie diese

WHERE decode(xxx,x1,'AND a.open_amount!= 0',x2,'',x3, 'AND a.invoice_amount != a.open_amount') 

dekodieren Wie sollte ich dieses Problem lösen, irgendwelche Tipps?

Antwort

2

Meinen Sie, wenn die erste "where-Bedingung" ODER die zweite ODER die dritte/TRUE ist, möchten Sie, dass die Gesamtsumme TRUE ist (wählen Sie die Zeile aus), und Sie suchen nach einer vereinfachten Schreibweise ? Das heißt, ohne sie einfach mit OR zu kombinieren?

Um dies zu erreichen, benötigen Sie keine CASE- und Nested CASE-Anweisungen oder DECODE. Man könnte es wie folgt tun:

WHERE A.CANCELLED = 'FALSE' 
    AND A.IDENTITY = '&client_id' 
    AND ((xxx = x1 AND a.open_amount != 0) OR (xxx = x2) OR 
     (xxx = x3 AND a.invoice_amount != a.open_amount) ) 

Dies besser lesbar ist, die Absicht ist klar, wird es leichter sein, zu ändern, wenn nötig ...

+0

Ja, das habe ich ein bisschen übertrieben ... * 8-) –

+0

Danke, sehr klar und funktionierend wie es soll – Mat

1

können Sie versuchen, so etwas wie -

WHERE A.CANCELLED = 'FALSE' 
    AND A.IDENTITY = '&client_id' 
    AND a.open_amount <> 
      (CASE 
       WHEN x1 THEN 0 
       WHEN x2 THEN a.open_amount + 1 -- This needs to be something that is always TRUE, to nullify the condition 
       WHEN x3 THEN a.invoice_amount 
      END); 

Edit: Dies basiert auf der Annahme, dass a.open_amount ein NUMBER ist und verwendet einen schnellen Hack, wo wir immer TRUE Zustand wie x <> x + 1 erstellen. Sie sollten dies wahrscheinlich basierend auf Ihren Daten auf das ändern, was Ihnen am besten passt.

+0

Wird die 'x2' Zustand funktionieren, wenn' open_amount' ist Null? Es ist vielleicht sowieso nicht nullbar, aber ich denke, wenn es dann das zweite OP-Standalone-Zustand ein anderes Ergebnis geben könnte? –

+0

@AlexPoole Sie haben absolut Recht. Guter Ruf. Ich lasse es hier so wie es ist, da ich die Antwort von Mathguy besser mag. Das sollte eh ein Hack sein :) – ruudvan