webentwicklung-frage-antwort-db.com.de

SQL Not Like Statement funktioniert nicht

Ich habe den folgenden Code in einer gespeicherten Prozedur.

WHERE
    WPP.ACCEPTED = 1 AND
    WPI.EMAIL LIKE '%@MATH.UCLA.EDU%' AND
    (WPP.SPEAKER = 0 OR
    WPP.SPEAKER IS NULL) AND
    WPP.COMMENT NOT LIKE '%CORE%' AND
    WPP.PROGRAMCODE = 'cmaws3'

Die NOT LIKE-Anweisung funktioniert nicht, und ja, bevor jemand etwas sagt, gibt es Elemente mit der COMMENT-Spalte, die CORE nicht enthält, und alle anderen Spalten sind in Ordnung.

Weiß jemand was daran falsch ist?

39
mattgcon

Ob WPP.COMMENT enthält NULL, die Bedingung stimmt nicht überein.

Diese Abfrage:

SELECT  1
WHERE   NULL NOT LIKE '%test%'

wird nichts zurückgeben.

In einer Spalte NULL werden sowohl LIKE als auch NOT LIKE gegen einen beliebigen Suchbegriff gibt NULL zurück.

Könnten Sie bitte relevante Werte einer Zeile posten, die Ihrer Meinung nach zurückgegeben werden sollten, aber nicht?

56
Quassnoi

Kommen Sie einfach auf dieses, die Antwort ist einfach, verwenden Sie ISNULL. SQL gibt keine Zeilen zurück, wenn das Feld, das Sie testen, (in einigen Datensätzen) keinen Wert hat, wenn Sie eine Textvergleichssuche durchführen, z.

WHERE wpp.comment NOT LIKE '%CORE%'

Sie haben also vorübergehend einen Wert in den null (leeren) Datensätzen durch den Befehl ISNULL ersetzt, z

WHERE (ISNULL(wpp.comment,'')) NOT LIKE '%CORE%'

Daraufhin werden alle Datensätze mit Nullen angezeigt und alle Datensätze mit übereinstimmenden Kriterien werden weggelassen. Wenn Sie möchten, können Sie etwas in die Kommas einfügen, um sich zu erinnern, z

WHERE (ISNULL(wpp.comment,'some_records_have_no_value')) NOT LIKE '%CORE%'
7

Ist der Wert Ihrer bestimmten COMMENT-Spalte null?

Manchmal weiß NOT LIKE nicht, wie man sich bei Nullen richtig verhält.

6
James Cronen

Ich bin auf dasselbe Problem gestoßen und habe es gelöst, aber erst, als ich diesen Beitrag gefunden habe. Und da Ihre Frage nicht wirklich beantwortet wurde, ist hier meine Lösung (die hoffentlich für Sie oder jeden anderen, der nach der gleichen Sache sucht, die ich getan habe, funktioniert;

Anstatt;

... AND WPP.COMMENT NOT LIKE '%CORE%' ...

Versuchen;

... AND NOT WPP.COMMENT LIKE '%CORE%' ...

Grundsätzlich funktionierte es für mich, das "NICHT" auf die andere Seite des Feldes zu bewegen, das ich auswertete.

4
Valiante

mattgcon,

Sollte es funktionieren, erhalten Sie mehr Zeilen, wenn Sie dasselbe SQL ausführen und die Zeile "NOT LIKE" auskommentiert ist? Wenn nicht, überprüfen Sie die Daten. Ich weiß, dass Sie in Ihrer Frage erwähnt haben, aber prüfen Sie, ob die eigentliche SQL-Anweisung diese Klausel verwendet. Die anderen Antworten mit NULL sind ebenfalls eine gute Idee.

1
Mark Kadlec