2013-03-21 29 views
0

所以我知道MySQL的说:有没有办法查询mysql中所有不在集合中的记录,即使它是空的?

一般来说,含有NULL值和空表表是在编写子查询,总是考虑是否采取了这两种可能性考虑“边缘情况。” http://dev.mysql.com/doc/refman/5.0/en/all-subqueries.html

但是这没有意义。如果我说:

select * from users where users.id NOT IN (NULL);

不应该返回所有用户吗?即使通过自己的逻辑说:

NOT IN是<> ALL的别名。因此,这两个语句是相同的:

对我而言,返回所有记录其中id不等于NULL,这是所有记录。

所以问题是,我怎样才能实现选择不在特定集合中的所有记录,即使该集合为空

显然,在我的应用程序代码(Rails应用程序)中,我可以检查该集是否为空并修改我的查询,但这看起来很荒谬。有什么办法可以在sql中完成这一切吗?

回答

2

假设NULL是或有一个值的常见错误 - 在这种情况下,您假设NULL = empty set

NULL意味着不确定的 - 所以在所有RDMS NULL = NULLNULLNULL <> NULLNULLAnything = NULL就是Anything <> NULL就是NULL。 RDMS中的NULL与数学中零除相同。

这就是为什么您必须使用特殊比较运算符IS NULL而不是=

查询结构化,因此可翻译为select * from users where users.id NOT IN (undefined)。并且users.id NOT IN (undefined)本身是undefined

我假设您的查询中的NULL来自Rails中的变量 - 我将其称为pnl(可能为空列表)。所以这个查询会给你你想要的。

select * from users where users.id NOT IN (pnl) OR pnl IS NULL; 
+0

很好的答案!感谢您的解释!对我来说,简单的解决方法是将空数组加入逗号分隔的字符串中 – 2013-03-21 05:13:54

相关问题