2013-02-25 19 views
5

Ho una query che ho bisogno di controllare circa 20 diverse colonne per un valore 0.O stenografia in Oracle SQL?

Piuttosto che fare:

DOVE LIBRO <> 0 O ALLO <> 0 O ...

C'è un modo più veloce per farlo? Qualcosa di simile: DOVE (BOOK, ALLO, ...) <> 0

+1

Penso SQL Server permette di fare '0 <> ANY (SELECT LIBRO UNION SELECT ALLO SELEZIONA ...) '. Il potere non deriva tanto dall'unione di tutte le cose che vuoi insieme, ma dall'uso di una sottoquery per trovarla. Oracle probabilmente ha un equivalente. –

+3

Quando dici più veloce, intendi semplicemente che non vuoi digitare tutte quelle colonne? È ... piuttosto strano, devi solo scriverli una volta e funziona per sempre. –

+0

Semplicemente ... no – SQLMason

risposta

5

Anche se non viene eseguito in qualsiasi altro luogo (MySQL, SQL-Server, Postgres) ed è probabilmente non SQL standard, funziona in Oracle:

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

testato in SQL-Fiddle


C'è anche un altro modo che è standard e lavora in MySQL e Postgres, ma non in Oracle:

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

E un altro modo standard (utilizzando una tabella di valori costruttore) che opera in Postgres e SQL-Server 2012:

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

Questo è fantastico, non sapevo che esistesse una funzione del genere. Grazie. – Lock

+0

'ANY' è un operatore, come' IN'. Non è una funzione. –

1

Si potrebbe utilizzare:

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

supponendo che non siano negativi ... –

+0

Buon punto. Dipende dal problema :-) – DCookie

+0

Sì, i negativi sono possibili! – Lock

1

Se valori negativi non sono possibili, si può fare questo:

WHERE BOOK + ALLO + ... > 0 

Se sono possibili valori negativi, questo è il modo più conciso possibile per esprimerlo:

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

Inoltre, questo è indipendente dal database.

Queste soluzioni funzioneranno solo se i valori nulli non sono possibili, se lo fossero, sarebbe piuttosto disordinato.

+0

Si potrebbe quindi utilizzare 'abs (nvl (libro, 0)) + ...' per oracle e 'isnull (..)' per server sql ... – glh