web-dev-qa-db-fra.com

L'instruction SQL Not Like ne fonctionne pas

J'ai le code suivant dans une procédure stockée.

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'

L'instruction NOT LIKE ne fonctionne pas et oui avant que quelqu'un dise quoi que ce soit, la colonne COMMENT contient des éléments qui n'incluent pas CORE et toutes les autres colonnes sont correctes.

Est-ce que quelqu'un sait ce qui ne va pas avec cela?

39
mattgcon

Si WPP.COMMENT contient NULL, la condition ne correspond pas.

Cette requête:

SELECT  1
WHERE   NULL NOT LIKE '%test%'

ne retournera rien.

Sur une colonne NULL, LIKE et NOT LIKE contre toute chaîne de recherche retournera NULL.

Pourriez-vous s'il vous plaît publier les valeurs pertinentes d'une ligne qui, à votre avis, devrait être renvoyée mais ce n'est pas le cas?

56
Quassnoi

La réponse est simple: utilisez ISNULL. SQL ne renverra pas de lignes si le champ que vous testez n'a pas de valeur (dans certains enregistrements) lors d'une recherche de comparaison de texte, par exemple:

WHERE wpp.comment NOT LIKE '%CORE%'

Donc, vous avez temporairement substitué une valeur dans les enregistrements null (vides) en utilisant la commande ISNULL, par exemple:

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

Cela affichera ensuite tous vos enregistrements ayant des valeurs NULL et omettra ceux qui correspondent à vos critères. Si vous le souhaitez, vous pouvez mettre quelque chose dans la virgule pour vous aider à vous en rappeler, par exemple

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

La valeur de votre colonne COMMENT particulière est-elle nulle?

Parfois, NOT LIKE ne sait pas comment se comporter correctement autour des valeurs nulles.

6
James Cronen

Je viens de rencontrer le même problème et je l'ai résolu, mais pas avant d'avoir trouvé ce message. Etant donné que votre question n’a pas vraiment été répondue, voici ma solution (qui, espérons-le, fonctionnera pour vous ou pour quiconque recherchant la même chose que moi;

Au lieu de;

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

Essayer;

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

En gros, déplacer le "PAS" de l’autre côté du terrain que j’évaluais a fonctionné pour moi.

4
Valiante

mattgcon,

Si vous travaillez, obtenez-vous plus de lignes si vous exécutez le même code SQL avec la ligne "NOT LIKE" commentée? Sinon, vérifiez les données. Je sais que vous avez mentionné dans votre question, mais vérifiez que la déclaration SQL actuelle utilise cette clause. Les autres réponses avec NULL sont également une bonne idée.

1
Mark Kadlec