Domanda

  

possibili duplicati:
   Perché una query SQL avere “dove 1 = 1”
   Perché usare qualcuno dove 1 = 1 e in una clausola SQL?

Ho visto che un sacco di diversi esempi di query e va a probabilmente tutti i motori SQL.

Se c'è una domanda che non ha condizioni le persone (e le strutture appositamente ORM) definiti spesso aggiungono sempre vera condizione WHERE 1 = 1 o qualcosa del genere.

Così, invece di

SELECT id, name FROM users;

usano

SELECT id, name FROM users WHERE 1 = 1;

L'unica ragione possibile che potevo pensare, se si sta aggiungendo le condizioni in modo dinamico non c'è bisogno di preoccuparsi di spogliando il AND iniziale, ma ancora molto spesso questa condizione 1 = 1 è spogliato se c'è un reale condizione nella query.

esempio reale da CakePHP (generato dal framework):

(senza condizioni)

SELECT `User`.`id`, `User`.`login`
FROM `users` AS `User` WHERE 1 = 1 
ORDER BY `User`.`id` ASC;

(con condizioni)

SELECT `User`.`id`, `User`.`login`
FROM `users` AS `User` 
WHERE `User`.`login` = 'me@example.com'
LIMIT 1;

C'è un motivo per l'aggiunta di tale condizione in più?

È stato utile?

Soluzione

Si, è in genere perché inizia come 'dove 1 = 0', per forzare la dichiarazione di fallire.

E 'un modo più ingenuo di avvolgendolo in un'operazione e non commetterlo alla fine, per testare la query. (Questo è il metodo preferito).

Altri suggerimenti

E 'anche una pratica comune quando le persone sono la costruzione della query SQL a livello di codice , è solo più facile per iniziare con 'dove 1 = 1' e poi aggiungendo 'e customer.id =: CustID' a seconda se un ID cliente è fornito. Così si può sempre aggiungere la parte successiva della query che iniziano con 'e ...'.

Il 1 = 1 viene ignorato da sempre tutti i RDBMS. Non v'è alcun compromesso l'esecuzione di una query con dove 1 = 1 .

Costruzione dinamica condizioni WHERE, come framework ORM o altro non molto spesso, è più facile aggiungere il reale , dove le condizioni perché si evita il controllo per anteponendo un e per la condizione attuale.

stmt += "WHERE 1=1";
if (v != null) {
   stmt += (" AND col = " + v.ToString());
}

Questo è come sembra, senza 1 = 1.

var firstCondition = true;
...
if (v != null) {
   if (!firstCondition) {
      stmt += " AND ";
   }
   else {
       stmt += " WHERE ";
       firstCondition = false;
   }
   stmt += "col = " + v.ToString());
}

La gente lo usa perché sono intrinsecamente pigri quando si costruisce query SQL dinamiche. Se si inizia con un "where 1 = 1" poi tutte le clausole extra solo iniziare con "and" e non si deve capire.

Non che ci sia qualcosa di sbagliato con l'essere intrinsecamente pigro. Ho visto le liste doppiamente collegate in cui una lista "vuoto" si compone di due linfonodi sentinella e si inizia l'elaborazione al first->next fino last->prev compreso.

Questo in realtà rimosso tutto il codice di gestione speciale per l'eliminazione di nodi first e last. In questo set-up, tutti il nodo è stato un nodo centrale dal momento che non sono stati in grado di eliminare o first last. Due nodi sono stati sprecati, ma il codice è stato più semplice e (sempre leggermente) più veloce.

L'unico altro posto che abbia mai visto il costrutto "1 = 1" è in BIRT. I rapporti spesso usano parametri posizionali e vengono modificati con Javascript per consentire a tutti i valori. Quindi la domanda:

select * from tbl where col = ?

quando l'utente seleziona "*" per il parametro utilizzato per col è modificato come segue:

select * from tbl where ((col = ?) or (1 = 1))

In questo modo la nuova query da utilizzare, senza armeggiare intorno con i dettagli dei parametri posizionali. C'è ancora esattamente un tale parametro. Qualsiasi DBMS discreti (ad esempio, DB2 / z) che ottimizzano query per rimuovere sostanzialmente la clausola completamente prima di tentare di costruire un piano di esecuzione, quindi non c'è alcun trade-off.

Uso 1 = 1 è in realtà non è una buona idea in quanto ciò può causare scansione completa della tabella di per sé.

Vedere questo -> T-SQL 1 = 1 Performance Hit

Come hai detto:

  

se si aggiunge condizioni   dinamicamente non ci si deve preoccupare   circa stripping iniziale E   questa è l'unica ragione potrebbe essere, hai ragione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top