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
在上面的第二个选项中,我期待“amar”记录,因为该名称与First,second或last name不匹配。
答案 0 :(得分:28)
与NULL
的任何比较都会产生NULL
。为了解决这个问题,您可以使用三个运算符:
x IS NULL
- 确定左手表达式是否为NULL
,x IS NOT NULL
- 如上所述,但相反,x <=> y
- 以安全的方式比较两个操作数的相等性,即NULL
被视为正常值。对于您的代码,您可能需要考虑使用第三个选项并使用null安全比较:
SELECT * FROM mycompare
WHERE NOT(name <=> fname OR name <=> mname OR name <=> lname)
答案 1 :(得分:6)
你cannot use relational operators with NULL
。与NULL
合作的唯一运营商是IS NULL
和IS NOT NULL
。
答案 2 :(得分:3)
当我编写更新触发器时,我遇到了同样的问题,并且只有当两个值不同时才想执行部分代码。使用IS NULL
和XOR
就派上用场了:
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
所以我最终使用了:
IF (OLD.col != NEW.col) OR ((OLD.col IS NULL) XOR ( NEW.col IS NULL)) THEN ...
答案 3 :(得分:2)
NULL
值(因为NULL
不是值)。您的where
子句基本上意味着:比较上述字段的值,如果它们的值为 - 其他为假。
如果您想要这些行,则必须单独检查NULL
。
答案 4 :(得分:1)
你可能会得到类似下面的东西(假设将NULL映射到''不是问题):
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,''));