2010-03-06 7 views
15
CREATE TABLE `mycompare` (
    `name` varchar(100) default NULL, 
    `fname` varchar(100) default NULL, 
    `mname` varchar(100) default NULL, 
    `lname` varchar(100) default NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

INSERT INTO `mycompare` VALUES('amar', 'ajay', 'shankar', NULL); 
INSERT INTO `mycompare` VALUES('akbar', 'bhai', 'aslam', 'akbar'); 
INSERT INTO `mycompare` VALUES('anthony', 'john', 'Jim', 'Ken'); 
_____ 

SELECT * FROM mycompare WHERE (name = fname OR name = mname OR name = lname) 
akbar bhai aslam akbar 

select * from mycompare where !(name = fname OR name = mname OR name = lname) 
anthony john Jim Ken 

Dans la seconde sélection ci-dessus, j'attends également l'enregistrement "amar" parce que ce nom ne correspond pas au prénom, au second ou au nom de famille.Comparaison avec les valeurs NULL

Répondre

28

Toute comparaison avec NULL cède NULL. Pour y remédier, il y a trois opérateurs que vous pouvez utiliser:

  • x IS NULL - détermine si l'expression de la main gauche est NULL,
  • x IS NOT NULL - comme ci-dessus, mais le contraire,
  • x <=> y - se compare deux opérandes pour l'égalité d'une manière sûre, c'est-à-dire NULL est vu comme une valeur normale.

Pour votre code, vous voudrez peut-être envisager d'utiliser la troisième option et aller avec la nulle comparaison sûre:

SELECT * FROM mycompare 
WHERE NOT(name <=> fname OR name <=> mname OR name <=> lname) 
+0

Plus d'infos: [Comparaison MySQL Fonctions et opérateurs] (http: //dev.mysql. com/doc/refman/5.7/fr/comparaison-opérateurs.html) – IvanRF

2

NULL Les valeurs sont omises automatiquement si vous effectuez une comparaison de valeurs (car NULL n'est pas une valeur). Votre clause where signifie fondamentalement: Comparer les valeurs des champs mentionnés, si elles ont une valeur - autrement faux.

Vous devez inclure une vérification séparée pour NULL si vous souhaitez également ces lignes.

1

Vous pourriez probablement avec quelque chose comme ce qui suit (en supposant que NULL à la cartographie « » est pas un problème):

SELECT * FROM mycompare 
WHERE (ifnull(name,'') = ifnull(fname,'') 
     OR ifnull(name,'') = ifnull(mname,'') 
     OR ifnull(name,'') = ifnull(lname,'')); 

select * from mycompare 
where !(ifnull(name,'') = ifnull(fname,'') 
     OR ifnull(name,'') = ifnull(mname,'') 
     OR ifnull(name,'') = ifnull(lname,'')); 
3

J'ai eu le même problème quand je rédigeais déclencheurs de mise à jour et je voulais exécuter la partie de code seulement lorsque deux valeurs différent. En utilisant IS NULL et XOR était pratique:

SELECT 1!=1;       -- 0 
SELECT 1!=2;       -- 1 
SELECT 1!=NULL;      -- NULL 
SELECT NULL!=NULL;     -- NULL 
SELECT NULL IS NULL XOR 1 IS NULL; -- 1 
SELECT NULL IS NULL XOR NULL IS NULL; -- 0 
SELECT 1 IS NULL XOR 1 IS NULL;  -- 0 

J'ai donc fini par utiliser:

IF (OLD.col != NEW.col) OR ((OLD.col IS NULL) XOR (NEW.col IS NULL)) THEN ... 
Questions connexes