2013-03-01 6 views
5

Jemand bitte erklären Sie die Bedeutung von '1 = 2' in der folgenden SQL-Abfrage.Verwendung von 1 = 2 in einer SQL-Abfrage

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 

dank

EDIT: - die kleinen Fehler behoben, bei dem Beispiel SQL-Abfrage von mir gegeben existierte. @ ALL: - Die hier genannte Abfrage ist eine Beispiel-Version einer großen Arbeitsabfrage, auf die ich etwas neu laden muss. Ich habe ein Beispiel-Szenario der SQL-Abfrage für die Einfachheit der Frage erstellt.

+1

Es ist immer falsch. Jemand hat es wahrscheinlich zum Testen hinzugefügt und vergessen, es herauszunehmen. – Narnian

+0

@a_horse_with_no_name: diese '1 = 2' ist nicht in einer Where-Klausel – Andomar

+0

In diesem Fall wird nur sichergestellt, dass der erste Teil des' CASE's niemals wahr ist, also wird immer der 'else' durchlaufen. Vielleicht temporärer Testcode, der hätte entfernt werden sollen oder nicht kommentiert werden? –

Antwort

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

Einfach, die obige Bedingung wird niemals true werden. So wird das Ergebnis immer C.Country_Name

3

Es entspricht einem FALSE-Argument.

Zum Beispiel;

select * from TABLE where 1=2 

gibt null Zeilen zurück.

1

Verwenden WHERE 1=2, wenn Sie alle Zeilen nicht abrufen möchten tun,

Wie 1=2 immer false ist.

1

durch Hinzufügen von und 1 = 2 wird dieser Fall immer false zurückgeben. Um herauszufinden, warum es da ist, fragen Sie die Person, die es dort hingelegt hat.

Ich vermute, dass es dort gesetzt wurde, damit der Autor die erste Bedingung fälschen konnte, und dann vergaß er, sie zu entfernen.

+0

ok .. er könnte vergessen haben, es zu entfernen. Aber was bedeutet 1 = 2 eigentlich? – Kings

5

Dies ist ein häufiger Trick, der bei der dynamischen Konstruktion von SQL-Filterklauseln verwendet wird. Dies ermöglicht die automatisierte Konstruktion von "T.Active = 'N' und" ohne Prüfung für eine folgende Klausel, weil "1 = 2" immer angehängt wird.

Update: Ob 1 = 1 oder 1 = 2 verwendet wird, hängt davon ab, ob konjunktive oder disjunktive Normalform soll in den Aufbau der automatisierten Klauseln verwendet werden. In diesem Fall scheint es eine Diskrepanz zwischen Design und Implementierung gegeben zu haben.

Update 2 Ich glaube, die meisten Entwickler konjunktive Normalform bevorzugen, mit den wichtigsten Begriffen von AND joind, aber disjunktive Normalform ist in Ausdruckskraft und Größe des Codes gleich.

+0

normalerweise tun Sie dies mit 1 = 1 nicht mit 1 = 2 .. Sie verwenden 1 = 1 in der Where-Klausel, so dass alle anderen Filter gehen könnte als 'und x = y' –

+0

Hoppla! Das wäre richtig, aber die automatisierte Konstruktion soll mit "ODER" statt "UND" enden. –

+0

yeap .. genau .. wenn es oder zwischen ihnen gewesen wäre, dann wäre deine Vermutung wahr gewesen. Ich denke nur, ist für Debug-Gründe. Auch weil die 1 = 2 am Ende steht .. und du stellst es normalerweise vor, damit die Aussage folgen wird. –

1

Ich würde vermuten, dass ein Debug-Skript ist. Es ist da, um immer den negativen Teil des Falles zurückzugeben. Wahrscheinlich wird dieser Teil bei der Veröffentlichung herausgenommen.

13

Es wird für diesen 1=2 Teil der WHERE Klausel eine gute Verwendung, wenn Sie eine Tabelle von einem anderen erstellen, aber Sie wollen keine Zeilen kopieren. Zum Beispiel:

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

1 = 2 bedeutet, dass wir eine Bedingung geben, die immer falsch ist; daher werden keine Datensätze ('NULL') für Ihre Zeilen angezeigt ...

dh erstellen Tabelle empt_tgt AS Select empno, ename, job, Mgr, sal WHERE 1 = 2;

dann davon aus, dass empt_tgt hat Aufzeichnungen für alle jene Spalten wenn wir führen Sie die folgende Anweisung: SELECT * FROM empt_tgt

EMPT_TGT null sein wird; Das heißt, wir sehen nur den Spaltennamen empno, ename, job, mgr, sal keine Daten ...