Perché usare WHERE 1 o WHERE 1 = 1?


50

Di solito, se non sono richieste condizioni nelle nostre dichiarazioni di query, non utilizziamo una WHEREclausola. Ma ho visto una WHERE 1clausola utilizzata in molti luoghi, anche dove non sono presenti altre condizioni.

  • Perché è fatto?
  • Ci sono vantaggi specifici per i tempi di esecuzione?
  • Abilita altre funzionalità?
  • L'utilizzo è WHERE 1=1simile a questo?

Risposte:


45

Fondamentalmente è solo per comodità del programmatore poiché puoi solo aggiungere ulteriori condizioni con AND...ciò e non ha alcun impatto sui tempi di esecuzione.

Dai un'occhiata a questi collegamenti a StackOverflow:

Si noti che WHERE 1è identico a WHERE 1=1; entrambi significano, WHERE TRUEma il primo è respinto da molti sistemi di gestione del database in quanto non è realmente booleano.


16

Il mio uso principale è che rende più facile commentare le cose durante lo sviluppo delle query. Conduco con ,'e and':

SELECT
     A
--  ,B
    ,C
    ,D
--  ,E
FROM TABLE
WHERE 1=1
--  and B='This'
    and C='That'
--  and D is not null

Inoltre, semplifica la gestione programmata degli oggetti fino alla fine.

this  = "SELECT * "
this += "FROM TABLE "
this += "WHERE 1=1 "
if user chooses option a then this += "and A is not null "
if user chooses option b then this += "and B is not null "
if user chooses option b then this += "and C is not null "
if user chooses option b then this += "and D is not null "

Altrimenti dovresti qualificare la prima opzione ... e ogni opzione seguente controlla le opzioni precedenti. Cosa succede se l'utente ha scelto l'opzione D solo nell'esempio precedente? Dovresti assicurarti che if A, B and C aren't chosenpoi usi WHEREaltro uso and. Con =all'inizio, puoi semplicemente dare uno schiaffo ai qualificatori alla fine della dichiarazione.


1
E hai scritto quel codice come il 1980 in un linguaggio senza orientamento agli oggetti, prima che qualcuno si inventasse l'idea di un generatore sql basato su oggetti?
TomTom,

Scrivo in modo codesimile al primo blocco in SSMS o strumenti di query simili. Ricerca di set di dati e ottenimento dei risultati giusti prima che vengano inseriti in strumenti di reporting (come Crystal Reports) per gli utenti finali. Il secondo blocco è quello che ho visto fare ad altre persone, dal momento che il mio lavoro non ha riguardato troppo l'accesso sql grezzo. Ho risolto il problema con codice simile di altre persone e posso capire il ragionamento. (Il codice era in VB, C # e PHP).
WernerCD,

10

Perché lo facciamo?

Mi viene in mente la generazione dinamica di codice scritta da programmatori non troppo competenti.

Genera SELECT .... WHERE e quindi devi avere QUALCOSA .... quindi invece di aggiungere WHERE solo quando necessario, aggiungono una condizione non limitativa quando non c'è nessuno. Visto che - responsabile per licenziare lo "specialista".

O il ragazzo solo cose DOVE è obbligatorio;)

Qualcos'altro che non riesco a vedere.


5

Stavo programmando un sacco di funzioni definite dall'utente in C ++ / C per PostgreSQL che venivano utilizzate da altre persone in una grande azienda (10K + persone). Le mie funzioni hanno un whereparametro opzionale : se non è stato fornito alcun valore, la clausola non è stata utilizzata. Questo è stato esplicitamente documentato. Sfortunatamente, nessuno ha usato questa funzione e tutti hanno semplicemente fornito where 1=1clausole. In teoria questo sembra poco saggio, praticamente tutti gli ottimizzatori di query escludono questo tipo di istruzioni. Ed è difficile educare 10.000 persone.


3
Nessuno ha mai chiamato il tuo UDF con WHERE 1=1; DROP TABLE CUSTOMERS?
Twinkles,

Tuttavia, non riesco a trovare i concetti alla base dell'uso della clausola Where 1. Hai bisogno di ulteriori chiarimenti? Dato che non ho avuto alcun miglioramento nei tempi di esecuzione.
ursitesion il

Questo ha poco da fare con il tempo di esecuzione. Ha a che fare con la cultura come programmano le persone. A volte capita che il tuo codice (programmato da personale IT) sia utilizzato dagli ingegneri. Questi ragazzi hanno il loro modo di pensare e invocare il tuo codice
Arthur

@Twinkles: questo è sicuramente un problema interessante. Ci sono alcuni punti qui da notare. (i) il database è di sola lettura per l'UDF (ii) La mia funzione unisce alcuni gruppi di tabelle per un gruppo di cose e, per peggiorare le cose, usa le funzioni di windowing del data warehousing. Ciò rende difficile eliminare qualsiasi cosa, anche se non impossibile, (iii) gli UDF sono pensati per il codice di pre-produzione. Il che significa che non entra mai in produzione: se la funzione sopravvive alla sfida, un altro dipartimento riscrive completamente tutto ciò che abbiamo programmato
Arthur

4
In realtà è abbastanza facile educare 10.000 persone. Fai in modo che l'applicazione fallisca quando lo fa in modo sbagliato. Smetteranno immediatamente di sbagliare.
Jasmine,

2

L'uso di "where 1 = 1" riduce la complessità del codice necessario nella generazione dinamica della clausola sql 'where'. Altrimenti, quando si crea la clausola 'where', è necessario verificare se questo è il primo componente per ciascun componente aggiunto. Questo è un modello di codice semplice per ridurre la complessità del codice e ridurre la complessità del codice, ove possibile, è quasi sempre la decisione giusta.


0

Ecco qua ... dal punto di vista della programmazione un uso di 1 = 1 ...inserisci qui la descrizione dell'immagine

In una situazione come questa, quando devo costruire una query in fase di esecuzione e può essere breve o lunga, utilizzo "dove 1 = 1 AND"

string criteria =string.Empty;
        if (txtc1.Text != "")
        {
            criteria += "criteria1=" + "'" + txtc1.Text + "' ";
        }
        if (txtc2.Text != "")
        {
            criteria += "OR criteria2=" + "'" + txtc2.Text + "' ";
        }
        if (ddl1.SelectedItem.Text != "")
        {
            criteria += "OR criteria3=" + "'" + ddl1.SelectedItem.Text + "' ";
        } if (ddl2.SelectedItem.Text != "")
        {
            criteria += "OR criteria4=" + "'" + ddl2.SelectedItem.Text + "' ";
        }
        if (ddl3.SelectedItem.Text != "")
        {
            criteria += "OR criteria5=" + "'" + ddl3.SelectedItem.Text + "' ";
        }
        if (ddl4.SelectedItem.Text != "")
        {
            criteria += "OR criteria6=" + "'" + ddl4.SelectedItem.Text + "' ";

        } 
        if (txtc1.Text == "")  
        {
            //criteria = criteria.Substring(2);
            criteria = criteria.Substring(2,criteria.Length-3);
        }
        if (criteria != string.Empty)
        {
            criteria = "where 1=1 AND " + criteria;
            //Response.Write("<script>alert('query constructed by you is : '+'" +criteria+ "');</script>");
            Response.Write(criteria);
        }

Rendi le cose più facili

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.