2013-02-25 10 views
5

Ich habe eine Abfrage, die ich um 20 verschiedene Spalten für einen Wert 0 überprüfen muss.ODER Kurzschrift in Oracle SQL?

Anstatt tun:

WHERE BOOK <> 0 OR < ALLO> 0 OR ...

Gibt es einen schnelleren Weg, es zu tun? Etwas wie: WHERE (Buch, Allo, ...) <> 0

+1

denke ich SQL Server ermöglicht es Ihnen, '0 zu tun <> ANY (BOOK UNION SELECT ALLO SELECT SELECT ...) '. Die Macht kommt nicht so sehr von der "UNION", die all die Dinge zusammenbringt, die ihr wollt, sondern mit einer Unterabfrage, um sie zu finden. Oracle hat wahrscheinlich ein Äquivalent. –

+3

Wenn du schneller sagst, meinst du nur, du willst nicht alle diese Spalten austippen? Das ist ... ziemlich seltsam, du musst sie nur einmal tippen und es funktioniert für immer. –

+0

Ganz einfach ... nein – SQLMason

Antwort

5

Obwohl es nirgendwo sonst läuft (MySQL, SQL-Server, Postgres) und es ist wahrscheinlich nicht SQL-Standard, es funktioniert in Oracle:

WHERE 0 <> ANY (BOOK, ALLO, ...) 

in Getestet SQL-Fiddle


Es gibt auch eine andere Möglichkeit, die Standard ist und funktioniert in MySQL und Postgres, aber nicht in Oracle:

WHERE (0, 0, ...) <> (BOOK, ALLO, ...) 

Und ein anderer Standardverfahren (eine Tabelle Werte Constructor verwenden), die in Postgres arbeitet und SQL-Server 2012:

WHERE 0 <> ANY (VALUES (BOOK), (ALLO), ...) 
+0

Das ist großartig, wusste nicht, dass eine solche Funktion existiert. Vielen Dank. – Lock

+0

'ANY' ist ein Operator, wie' IN'. Es ist keine Funktion. –

1

Sie verwenden:

WHERE (book + allo + ...) > 0 
+2

unter der Annahme, dass sie nicht negativ sind ... –

+0

Guter Punkt. Kommt auf das Problem an :-) – DCookie

+0

Ja, Negative sind möglich! – Lock

1

Wenn negative Werte nicht möglich sind, können Sie dies tun:

WHERE BOOK + ALLO + ... > 0 

Wenn negative Werte möglich sind, ist dies die knappste Art, wie ich denken kann, um es auszudrücken:

WHERE ABS(BOOK) + ABS(ALLO) + ... > 0 

Auch dies ist datenbankunabhängig.

Diese Lösungen funktionieren nur, wenn Nullwerte nicht möglich sind. Wenn dies der Fall ist, würde es ziemlich unordentlich werden.

+0

Sie könnten dann 'abs (nvl (Buch, 0)) + ...' für Orakel und 'isnull (..)' für SQL-Server ... – glh