mysql - 有没有办法查询 mysql 中不在集合中的所有记录,即使它是空的?

标签 mysql sql

所以我知道 mysql 说:

In general, tables containing NULL values and empty tables are “edge cases.” When writing subqueries, always consider whether you have taken those two possibilities into account. http://dev.mysql.com/doc/refman/5.0/en/all-subqueries.html

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

从 users.id NOT IN (NULL) 的用户中选择 *;

它不应该返回所有用户吗?即使按照他们自己的逻辑:

NOT IN is an alias for <> ALL. Thus, these two statements are the same:

对我来说,返回 id 不等于 NULL 的所有记录,即所有记录。

所以问题是,如何实现选择不在特定集合中的所有记录,即使该集合为空

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

最佳答案

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

NULL意味着未定义 - 所以在所有 RDMS 中 NULL = NULLNULLNULL <> NULL也是NULL 。就此而言Anything = NULLNULL原样Anything <> NULLNULL RDMS 中的除数与数学中的除零相同。

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

因此,您构建的查询将转换为 select * from users where users.id NOT IN ( 未定义 ) 。和users.id NOT IN ( 未定义 )本身未定义

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

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

关于mysql - 有没有办法查询 mysql 中不在集合中的所有记录,即使它是空的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15539599/

相关文章:

mysql - 如何通过具有多个可搜索列的 MySQL DB 进行有效搜索?

python - 用于 SQL Alchemy 的 Py3k MySQL 驱动程序

mysql - 对带有负数的 ENUM 列使用 SUM()

SQL 服务器 : check for existing entry before UPDATE

sql - 将 1000 列旋转/透视为行

MySQL:选择 2 个具有不同列名称和数量的表

mysql - 根据用户注册月份的日期每月选择记录

MYSQL WHERE NOT查询

php - 如果记录在一张表中,如何显示名称而不是 ID?

mysql - 我可以在没有 root 访问权限的情况下更改 OpenShift 中的 my.inf 吗?