与NULL值比较

时间:2010-03-06 15:57:06

标签: mysql

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不匹配。

5 个答案:

答案 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 NULLIS NOT NULL

答案 2 :(得分:3)

当我编写更新触发器时,我遇到了同样的问题,并且只有当两个值不同时才想执行部分代码。使用IS NULLXOR就派上用场了:

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,''));