wake-up-neo.com

NOT LIKE und LIKE geben kein gegenteiliges Ergebnis zurück

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.

58
Shanka

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
73
sagi

(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.

18
Salman A

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%'
2
infectious
  1. Select * from tbl1 
    WHERE ([TextCol] NOT LIKE '%TAX%') AND ([TextCol] NOT LIKE '%TAX%')
    
  2. select * from tbl1
    where [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL
    
1
Chanukya

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.

0
Yossi Orsen

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) 
0
Tomas Hesse