2013-03-01 17 views
5

Qualcuno può spiegare il significato di '1 = 2' nella query SQL sottostante.Uso di 1 = 2 in una query SQL

SELECT E.EmpID, 
     E.EmpName, 
     Country = CASE 
        WHEN T.Active = 'N' 
         AND 1 = 2 THEN 'Not Working Anymore' 
        ELSE C.Country_Name 
       END, 
     T.Contract_No 
FROM Employees E (nolock) 
     INNER JOIN Contract T 
     ON T.Contract_No = E.Contract_No 
     LEFT JOIN Country C (nolock) 
     ON E.Country_ID = C.Country_ID 

grazie

EDIT: - Corretto il piccolo errore esisteva nella query SQL di esempio dato da me. @ ALL: - La query menzionata qui è una versione di esempio di una grande query di lavoro su cui devo ripetere qualcosa. Ho creato uno scenario di esempio di query SQL per semplicità di domanda.

+1

È sempre falso. Qualcuno probabilmente l'ha aggiunto per testare e ha dimenticato di portarlo fuori. – Narnian

+0

@a_horse_with_no_name: questo '1 = 2' non è in una clausola where – Andomar

+0

In questo caso assicura solo che la prima parte di' CASE' non possa mai essere vera, quindi passerà sempre a 'else'. Forse un codice di prova temporaneo che avrebbe dovuto essere rimosso o invece di commentare? –

risposta

5
when T.Active = 'N' and 1=2 then 'Not Working Anymore' 

Semplice, la condizione di cui sopra non diventerà mai true. Così il risultato sarà sempre C.Country_Name

3

Corrisponde a un argomento FALSE.

Ad esempio;

select * from TABLE where 1=2 

restituisce zero righe.

1

Usa WHERE 1=2 se non si desidera recuperare tutte le righe,

Come 1=2 è sempre false.

1

l'aggiunta e 1 = 2 farà sì che il caso restituisca sempre false. Per scoprire perché è lì, chiedi alla persona che lo ha messo lì.

Sospetto che sia stato messo lì così l'autore potrebbe forzare la prima condizione a essere falsa e poi ha dimenticato di rimuoverlo.

+0

ok .. potrebbe aver dimenticato di rimuoverlo. Ma cosa significa 1 = 2 in tempo reale ?? – Kings

5

È un trucco comune utilizzato nella costruzione dinamica delle clausole del filtro SQL. Ciò consente la costruzione automatica di "T.Active = 'N' e" senza controllo necessario per una clausola successiva, poiché "1 = 2" sarà sempre aggiunto.

Aggiornamento: Sia 1 = 1 o 1 = 2 viene utilizzato dipende dal fatto che si suppone forma normale congiuntiva o disgiuntiva per essere utilizzati nella costruzione delle clausole automatiche. In questo caso, sembra esserci stata una mancata corrispondenza tra progettazione e implementazione.

Update 2 Credo che la maggior sviluppatori preferiscono forma normale congiuntiva, con i principali termini sono entrati a far da AND, ma forma normale disgiuntiva è uguale in potenza e dimensioni del codice espressivo.

+0

di solito lo fai con 1 = 1 non con 1 = 2 .. tu usi 1 = 1 nella clausola where in modo che tutti gli altri filtri possano andare come 'e x = y' –

+0

Oops! Ciò sarebbe vero, ma la costruzione automatica dovrebbe terminare con "OR" anziché "AND". –

+0

yeap .. esattamente .. se ci sarebbe stato o tra loro allora la tua supposizione sarebbe stata vera. Penso solo sia per motivi di debug. Anche perché il 1 = 2 è alla fine .. e di solito lo metti di fronte in modo che l'affermazione segua. –

1

Direi che è uno script di debug. È lì per restituire sempre la parte negativa del caso. Probabilmente al momento del rilascio quella parte è stata ritirata.

13

C'è un buon uso di questo 1=2 parte della clausola WHERE se si sta creando una tabella da un altro, ma non si vuole copiare le righe. Ad esempio:

CREATE TABLE ABC_TEMP AS 
    SELECT * FROM ABC WHERE 1=2; 
1

1 = 2 significa che stiamo dando una condizione che sarà sempre falsa; quindi nessun record mostrerà ('NULL') per le tue righe ...

cioè Crea una tabella empt_tgt AS Select empno, ename, lavoro, mons, sal WHERE 1 = 2;

quindi assumendo che empt_tgt ha record per tutte quelle colonne quando eseguiamo la seguente dichiarazione: SELECT * FROM empt_tgt

EMPT_TGT sarà nullo; nel senso che vedremo solo il nome della colonna empno, ename, job, mgr, sal nessun dato ...

Problemi correlati