2016-04-08 11 views
1

ist habe ich COLUMN1 CHAR(1) in MYTABLE wo alle Zeilen NULL sind und hier ist meine SQL-Abfrage:DB2 auswählen, wo nicht gleich Zeichenfolge, die NULL

SELECT COLUMN1 FROM MYTABLE WHERE COLUMN1 != 'A' 

es gibt nichts, weil alle Zeilen NULL in COLUMN1 haben. Ich nehme an, es sollte alles zurückgeben. Wie kann ich es funktionieren lassen? Ich möchte nicht

COALESCE(NULLIF(COLUMN1, ''), '*') 

verwenden, weil es die Abfrage verlangsamt. Gibt es noch andere Alternativen?

Antwort

1

Wenn Sie wirklich NULLs wollen, warum dann nicht

SELECT COLUMN1 FROM MYTABLE WHERE (COLUMN1 != 'A' OR COLUMN1 IS NULL) 

???

+0

danke .. es funktioniert – VladP

1

Ihre Annahme ist falsch. Grundsätzlich geben alle Vergleichsoperatoren mit NULL "false" oder NULL zurück (die beide in einem WHERE -Klausel herausgefiltert werden), mit Ausnahme von IS NULL und IS NOT NULL.

Ihre Abfrage sollte also sein:

WHERE column1 <> 'A' OR COLUMN1 IS NULL 

Oder alternativ COALESCE() (NULLIF() NICHT verwenden:

WHERE COALESCE(column1, '') <> 'A' 
+0

danke .. es funktioniert – VladP

1

der semantischen von NULL Denken Sie es so, wie Sie wollen. , aber es soll "unbekannt" bedeuten. Unbekannt = "A"? Nein. Aber unbekannt! = "A"? Nein. Wir wissen einfach nicht, was es ist, also werden fast alle Vergleiche scheitern.

Sie können IS NULL und IS NOT NULL verwenden, zwei spezielle Operatoren, die für die Verwendung mit NULL entwickelt wurden. So können Sie etwas tun wie:

SELECT COLUMN1 FROM MYTABLE WHERE COLUMN1 != 'A' OR COLUMN1 IS NULL 

Aber zuerst fragen Sie sich: ist das, was Sie wollen? Verwenden Sie wirklich NULL für unbekannte Werte? SQL-Semantik für NULL ist vollkommen logisch, wenn Sie es einen unbekannten Wert betrachten, aber es kompliziert alles unnötig in allen anderen Fällen. Im Grunde genommen war die Einführung von in SQL wahrscheinlich ein Fehler, da die Probleme, die es in einem Tag verursacht, mehr sind als die Probleme, die es in der Geschichte der relationalen Theorie bis jetzt gelöst hat.