2016-04-22 8 views
0

So habe ich eine SQL-Abfrage i aktuell, dass arbeite ist wie folgt:SQL-Abfrage NVL String mit Apostrophe (')

SELECT * from tableA where 
(status = NVL('','OPEN') or status = NVL('','CLOSED')) 
and delete_flag != 'Y' 

Die obige Abfrage funktioniert gut und gibt mir das Ergebnis, das ich will .. aber Ich habe mich gefragt, ob es überhaupt möglich ist, den obigen Status IN NVL-Zeile mit einem zu kombinieren, anstatt das oder dort zu verwenden.

zum Beispiel möchte ich in der Lage sein, zu tun:

SELECT * from tableA where 
status IN NVL('','OPEN','CLOSED') 
and delete_flag != 'Y' 

Aber die Apostrophe arbeiten hier nicht mit mir .. wie kann ich es umgehen?

+1

was genau sind du versuchst es zu tun? –

+0

@vkp Ich versuche zu sehen, ob ich die beiden status = Anweisungen zu einer Zeile wie im Beispiel habe ich zeigen konnte .. – psj01

+0

sorry .. macht das Sinn? ... – psj01

Antwort

1

Sie einen Eingabeparameter aus Ihrer Anwendung erhalten, die die Werte „Öffnen“, „Geschlossen“ oder null

Sie wollen Statuswerte in der Lage sein können auswählen, die diesen Eingang paremeter gleich, wenn es null ist oder der Wert der Eingabe, wenn dies nicht der Fall ist

Um für einen Filter standardmäßig Null zu haben, verwenden Sie COALESCE und die Spalte, nach der Sie filtern.

Gefällt Ihnen dieses

SELECT * from tableA 
where COALESCE(parameter,status) = status 
    and status in ('OPEN','CLOSED') -- see comments 
    and delete_flag != 'Y' 

In diesem Fall, wenn der Parameter OPEN ist, werden Sie alle offenen Posten erhalten, wenn der Parameter geschlossen ist, werden Sie alle geschlossenen Einzelteile erhalten und wenn es null ist, werden Sie alle Einzelteile erhalten.

Dies ist ein sehr häufiges Muster in Web-Anwendungen.


Einzelzeilenversion

SELECT * from tableA 
where COALESCE(parameter,CASE WHEN status in ('OPEN','CLOSED') then status ELSE '' END) = status 
    and delete_flag != 'Y' 
+0

auswählen Das funktioniert so lange wie das OP reingibt 'OPEN', 'GESCHLOSSEN' oder '' und Status ist nicht nullbar –

+0

@hogan diese Art von Arbeiten .. aber wenn es Null möchte ich nur 'OPEN' und 'GESCHLOSSEN' Artikel .. Status andere Werte haben .. – psj01

+0

@ psj01 ok Ich habe das bearbeitet, um das zu tun. – Hogan

1

einfach:

SELECT * from tableA 
where 1=1 
    and nvl(status, '---') IN ('OPEN','CLOSED') 
    and delete_flag != 'Y' 
+0

Warum '1 = 1' und warum' NVL' überhaupt benutzen? Wenn der Status "NULL" ist und es nicht "IN" ('OPEN', 'CLOSED') ist, wird die Zeile nicht eingeschlossen - genau so, als würden Sie nach '' --- '' suchen. – MT0

+0

1 = 1 ist für das leichtere Lesen – Thomas

1

In Oracle eine leere Zeichenkette '' entspricht NULL.

Also NVL('', 'OPEN') ist das Äquivalent zu NVL(NULL, 'OPEN'), die auf nur 'OPEN' vereinfacht werden kann.

So Ihre Frage ist:

SELECT * 
FROM tableA 
WHERE (status = 'OPEN' OR status = 'CLOSED') 
AND delete_flag != 'Y' 

Welche vereinfacht werden kann:

SELECT * 
FROM tableA 
WHERE status IN ('OPEN', 'CLOSED') 
AND delete_flag != 'Y' 

Sie können eine dynamische Liste der Optionen implementieren eine Sammlung mit:

CREATE TYPE stringlist IS TABLE OF VARCHAR2(100); 
/

SELECT a.* 
FROM tableA a 
     INNER JOIN 
     (SELECT stringlist('OPEN', 'CLOSED') AS options FROM DUAL) o 
     ON (o.options IS EMPTY OR a.status MEMBER OF o.options) 
WHERE a.delete_flag <> 'Y' 
+0

Ja. aber ich habe den Benutzer, wählen Sie offen oder geschlossen aus einer Dropdown-Liste .. und wenn der Benutzer weder öffnen noch geschlossen .. dann möchte ich alle Zeilen, in denen der Status ist entweder im offenen oder geschlossenen Status .. welcher Deshalb benutze ich NVL ('', 'xyz'), wenn der Benutzer nichts auswählt, dann '' und ich möchte, dass er durch xyz ersetzt wird. Hinweis: Es gibt andere Status in der Tabelle als open/closed. – psj01

+0

@ psj01 Dann solltest du das in der Frage angeben. – MT0

+0

Ja, ich weiß, dass die Frage irgendwie unklar ist. Aber ich war mir nicht sicher, wie ich es richtig schreiben sollte. Entschuldigung. – psj01