Ich habe eine Tabelle mit 200 Datensätzen, von denen 10 Datensätze Text enthalten, der das Wort "TAX" enthält.
Wenn ich exekutiere
Select * from tbl1 WHERE [TextCol] LIKE '%TAX%'
dann erhalte ich das Ergebnis mit diesen 10 Datensätzen richtig.
Aber wenn ich versuche, diese Datensätze durch auszuschließen
Select * from tbl1 WHERE [TextCol] NOT LIKE '%TAX%'
es gibt nur 100 Datensätze zurück, anstatt 190.
Gibt das korrekte Ergebnis zurück?
Select * from tbl1 WHERE COALESCE([TextCol],'-1') NOT LIKE '%TAX%'
Ich glaube, dass NULL
-Werte hier das Problem sind. Wenn die Spalte sie enthält, gibt NULL NOT LIKE '%TAX%'
UNKNOWN/NULL
zurück und wird daher nicht ausgewählt.
Ich empfehle Ihnen, über Umgang mit NULL
Werten oder hier zu lesen.
Wie @ughai vorgeschlagen hat, können Sie bei Leistungsproblemen auch Folgendes verwenden:
Select * from tbl1
WHERE [TextCol] NOT LIKE '%TAX%'
OR [TextCol] IS NULL
(A) SQL-Vergleichsoperatoren ergeben drei mögliche Werte: True, False und Unknown. Wenn einer oder beide Operanden NULL
sind, ist das Ergebnis unbekannt. Betrachten Sie das folgende Beispiel, in dem wir einige Werte (das Alter einer Person) mit einer Konstanten (18) vergleichen:
21 >= 18 -- True
15 >= 18 -- False
NULL >= 18 -- Unknown
Wie Sie sehen, kann/wird die Datenbank nicht entscheiden, ob NULL
größer als/gleich 18 ist.
(B) Die Datenbank gibt nur Zeilen zurück, in denen die WHERE
-Klausel als True ausgewertet wird. Das Umkehren des Ausdrucks (z. B. WHERE age >= 18
geändert in WHERE age < 18
) hat keine Auswirkungen auf unbekannte Ergebnisse.
Sie können den IS [NOT] NULL
verwenden, um NULL
-Werte abzugleichen. Die folgende Abfrage wählt die Zeilen aus, in denen die Spalte nicht mit dem Muster OR übereinstimmt. Die Spalte ist NULL:
WHERE [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL
Funktionen wie ISNULL
und COALESCE
können verwendet werden, um NULL
in einen Wert umzuwandeln.
Es passiert mir auch einmal! Nachdem ich mir den Kopf gebrochen hatte, stellte ich fest, dass es an Nullwerten lag. Sie können diese Abfrage verwenden, um dies zu vermeiden:
WHERE CASE WHEN [TextCol] IS NULL
THEN 'default'
ELSE [TextCol]
END NOT LIKE '%TAX%'
Select * from tbl1
WHERE ([TextCol] NOT LIKE '%TAX%') AND ([TextCol] NOT LIKE '%TAX%')
select * from tbl1
where [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL
Sie müssen auch nach NULL-Werten suchen:
[TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL
Dies sollte sich auch um Nullwerte kümmern, weshalb Sie wahrscheinlich nicht alle Zeilen in der Ausgabe erhalten haben.
Ich hatte das gleiche Problem mit dem IN
-Operator in einer einfachen int-Spalte mit Nullwerten ..__ Ich fand heraus, dass diese nicht umgekehrt sind, als ich dachte. (Ich könnte es an der Reihenzählung erkennen)
select * from Dest where id in(select id from Source)
select * from Dest where id NOT in(select id from Source)
Um sich gegenseitig umzukehren, musste ich sie auch so umschreiben:
select * from Dest where isnull(id,-2) in(select isnull(id,-1) from Source)
select * from Dest where isnull(id,-2) NOT in(select isnull(id,-1) from Source)