54 votes

PAS LIKE et LIKE ne retournant pas un résultat opposé

J'ai une table avec 200 enregistrements dont 10 contiennent du texte contenant le mot "TAX".

Quand j'exécute

 Select * from tbl1 WHERE [TextCol] LIKE '%TAX%'
 

puis j'obtiens le jeu de résultats avec ces 10 enregistrements correctement.

Mais quand j'essaie d'exclure ces enregistrements par

 Select * from tbl1 WHERE [TextCol] NOT LIKE '%TAX%'
 

il ne renvoie que 100 enregistrements au lieu de 190.

75voto

sagi Points 32665

Est-ce à renvoyer le résultat correct ?

Select * from tbl1 WHERE COALESCE([TextCol],'-1') NOT LIKE '%TAX%'

Je crois NULL des valeurs sont le problème ici, si la colonne contient, alors NULL NOT LIKE '%TAX%' sera de retour UNKNOWN/NULL et donc de ne plus être sélectionné.

Je vous conseille de lire à propos de la manipulation avec NULL valeurs , ou ici.

@Ughai suggéré, si la performance est un problème, vous pouvez également utiliser:

  Select * from tbl1 
  WHERE [TextCol] NOT LIKE '%TAX%'
     OR [TextCol] IS NULL

18voto

Salman A Points 60620

(A) SQL opérateurs de comparaison de résultats dans trois valeurs possibles: True, False et Inconnu. Si l'un ou les deux opérandes sont des NULL , alors le résultat est Inconnu. Prenons l'exemple suivant, lorsque l'on compare certaines valeurs (l'âge d'une personne) avec une constante (18):

21   >= 18 -- True
15   >= 18 -- False
NULL >= 18 -- Unknown

Comme vous pouvez le voir, la base de données est/peut pas décider si NULL est égal ou supérieur à 18.

(B) La base de données, vous obtiendrez uniquement les lignes où l' WHERE clause est évaluée à True. L'inversion de l'expression (par exemple, WHERE age >= 18 changé d' WHERE age < 18) n'a pas d'incidence sur des résultats Inconnus.

Vous pouvez utiliser l' IS [NOT] NULL pour correspondre NULL valeurs. La requête suivante sélectionnez les lignes où la colonne ne correspond pas au modèle OU de la colonne est NULL:

WHERE [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL

Des fonctions telles que ISNULL et COALESCE peut être utilisé pour transformer l' NULL en valeur.

2voto

infectious Points 41

Cela m'arrive aussi une fois! après avoir brisé ma tête, j'ai découvert que c'était à cause de valeurs nulles, vous pouvez donc utiliser cette requête pour l'éviter:

 WHERE CASE WHEN [TextCol] IS NULL
           THEN 'default' 
           ELSE [TextCol] 
      END NOT LIKE '%TAX%'
 

0voto

Chanukya Points 4368
  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
     

0voto

Yossi Orsen Points 64

Vous devez également vérifier les valeurs NULL:

     [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL
 

Cela devrait également prendre en compte les valeurs nulles, ce qui explique probablement pourquoi vous n’avez pas obtenu toutes les lignes de la sortie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X