2012-02-04 3 views
21

Ho visto una query eseguita in un file di registro su un'applicazione. e conteneva una query come:perché dovresti usare WHERE 1 = 0 istruzione in SQL?

SELECT ID FROM CUST_ATTR49 WHERE 1=0 

qual è l'utilizzo di tale query che è destinata a non restituire nulla?

+2

probabilmente è un trucco per aggirare una "caratteristica" ORM. –

+0

Dove hai trovato questa query? –

+0

Duplicato: http://stackoverflow.com/questions/517107/why-would-a-sql-query-have-where-1-1 – Krumelur

risposta

48

Una query come questa può essere utilizzata per eseguire il ping del database. La clausola:

WHERE 1=0 

Assicura che non i dati vengono inviati indietro, quindi senza alcun costo della CPU, senza traffico di rete o di altro consumo di risorse.

Una query del genere può testare per:

  • disponibilità del server
  • CUST_ATTR49 tavolo esistenza
  • ID colonna esistenza
  • Mantenere una connessione attiva
  • Causa a grilletto per sparare senza cambiare alcuna righe
  • gestire molte condizioni OR in query dinamiche (ad esempio WHERE 1=0 OR <condition>)
+0

Eeeek !!! perfezionare! Grazie – MozenRath

+1

* mantenendo una connessione attiva –

+0

Sicuro! Modificato. Grazie. –

10

Un caso di utilizzo mi viene in mente: si dispone di un modulo di filtro in cui non si desidera avere risultati di ricerca. Se si specifica un filtro, vengono aggiunti alla clausola where.

Oppure viene solitamente utilizzato se è necessario creare una query sql a mano. Per esempio. non si vuole verificare se la clausola in cui è vuota o not..and si può semplicemente aggiungere cose come questa:

where := "WHERE 0=1" 

if X then where := where + " OR ... " 
if Y then where := where + " OR ... " 

(se ci si connette con le clausole o avete bisogno di 0 = 1, se avete E hai 1 = 1)

+0

come esattamente? puoi fornire un esempio? – MozenRath

+0

ohhk. Ho capito, per 1 = 1 usi AND e per 1 = 0 usi OR. Bello! Grazie – MozenRath

-2

Sembra che qualcuno stia tentando di violare il database. Sembra che qualcuno abbia provato l'iniezione di mysql. Si può leggere di più su di esso qui: Mysql Injection

2

Citato da Greg

Se l'elenco delle condizioni non è noto al momento della compilazione ed è invece costruito in fase di esecuzione, non dovete preoccuparvi di se si dispone di uno o più di una condizione. È possibile generare tutti piace:

e

e li concatena insieme. Con 1 = 1 all'inizio, l'iniziale e ha qualcosa da associare.

Non l'ho mai visto utilizzato per alcun tipo di protezione per l'iniezione, come si dice che non sembra che sarebbe di grande aiuto. L'ho visto usato come comodità di implementazione . Il motore di query SQL finirà per ignorare 1 = 1, quindi non dovrebbe avere alcun impatto sulle prestazioni.

Why would someone use WHERE 1=1 AND <conditions> in a SQL clause?

+0

L'ho letto ma non credo che OR verrebbe utilizzato in caso di 1 = 0 finché non avrò risposte per questa domanda – MozenRath

7

Questo può essere usato anche per estrarre lo schema della tabella da una tabella senza estrarre tutti i dati all'interno di quel tavolo. Come ha detto Andrea Colleoni, quelli saranno gli altri benefici dell'utilizzo di questo.

1

Alcuni sistemi utilizzano script e possono impostare dinamicamente i record selezionati da nascondere da un elenco completo; quindi una condizione falsa deve essere passata all'SQL. Ad esempio, tre record su 500 possono essere contrassegnati come Privacy per motivi medici e non dovrebbero essere visibili a tutti. Una query dinamica controllerà i 500 record visibili a quelli in HR, mentre 497 sono visibili ai gestori. Un valore verrebbe passato alla clausola SQL impostata in modo condizionale, ad esempio "WHERE 1 = 1" o "WHERE 1 = 0", a seconda di chi ha effettuato l'accesso al sistema.

1

Se l'utente intende aggiungere solo record, il metodo più veloce è aprire il recordset senza restituire alcun record esistente.