2009-07-01 12 views
5

Sto lavorando con un client che avvia quasi tutte le clausole WHERE in Oracle con 1=1. Perdona la mia ignoranza, ma non è un no-op? Ci sono conseguenze negative di questo utilizzo?In Oracle, si sta avviando la clausola WHERE di SQL Query con 1 = 1 utile?

Ecco un esempio fregati:

SELECT gpz.zname 
     ,gpp.pname 
FROM  table1 gpp INNER JOIN table2 gpz ON gpz.p_id = gpp.p_id 
WHERE 1=1 
     AND gpp.active = 1 
     AND gpz.active = 1 

risposta

18

E 'fatto per semplificare la generazione SQL dinamico. Fondamentalmente ogni condizione può essere aggiunta come AND <condition> senza considerare la prima condizione come speciale (è preceduta da WHERE non AND) o addirittura preoccupante se ci dovrebbe essere una clausola WHERE.

Quindi basta scriverlo come facile da usare o, probabilmente, la pigrizia.

+1

+1 per pigrizia, semplificando il PL/SQL da una o due linee e questo tipo di SQL sul database è piuttosto scarso. Peccato se per qualche ragione hanno bisogno di impostare cursor_sharing = FORCE - non sono sicuro, ma penso che il CBO si troverebbe di fronte a "WHERE: 1 =: 2 AND ..." e lo ottimizzerà di conseguenza! Sii interessante scoprire ... –

+0

Sospettavo che fosse così. Questo client ha effettivamente query non dinamiche come questa. Sono davvero pigri :) – Blanthor

+0

@JeffreyKemp Secondo [T-SQL 1 = 1 Performance Hit] (http://stackoverflow.com/q/1049512), il DBMS non subisce un calo di prestazioni utilizzando questo modello. –

0

Potrebbe aver creato la query da sottostringhe.

Potrebbe essere un modo per costruirlo con solo AND s, a seconda della corrispondenza della regola aziendale, quindi non devi preoccuparti di quale sia la tua prima condizione.

Non lo farei in questo modo.

3

Se stanno creando la query in modo dinamico, è necessario verificare se stanno utilizzando le variabili di collegamento. La creazione della query da valori letterali richiede un'analisi più approfondita, una limitazione potenzialmente limitante e può anche aumentare notevolmente il rischio di attacchi SQL Injection.

where 1 = 1 and my_id = :b1; 

(e quindi definire il valore della variabile bind)

è generalmente molto migliore di:

where 1 = 1 and my_id = 123456;