WHERE NOT IN 返回一个空集,而它不应该

Posted

技术标签:

【中文标题】WHERE NOT IN 返回一个空集,而它不应该【英文标题】:WHERE NOT IN returns an empty set while it shouldn't 【发布时间】:2020-06-17 08:37:02 【问题描述】:

此查询返回90 826 行:

SELECT DISTINCT ClientID FROM devices;

现在我检查在另一个具有相同列的表中存在多少:

SELECT DISTINCT ClientID FROM devices
WHERE ClientID IN
(
    SELECT DISTINCT ClientID FROM patients
);

这会返回90 736 行,因此90 行不应在此其他表中。让我们检查一下以确保:

SELECT DISTINCT ClientID FROM devices
WHERE ClientID NOT IN
(
    SELECT DISTINCT ClientID FROM patients
);

但这给了我一个空集,0 行。这不应该是正确的,所以我更进一步,尝试这个:

SELECT DISTINCT ClientID FROM v_keszulekek
WHERE ClientID NOT IN
(
    SELECT DISTINCT ClientID FROM devices
    WHERE ClientID IN
    (
        SELECT DISTINCT ClientID FROM patients
    )
);

这确实给了我90 行,但我认为第一个版本应该也能正常工作。

显然我错过了什么。

【问题讨论】:

欢迎来到NULL的陌生世界 添加条件 WHERE CLIENTID IS NOT NULL 以及 CLIENTID NOT IN 条件 SELECT DISTINCT ClientID FROM devices WHERE ClientID IS NOT NULL AND* ClientID NOT IN(从患者中选择 DISTINCT ClientID WHERE ClientID IS NOT NULL); 显示show create table devicesshow create table patients的输出。 确实 SELECT DISTINCT ClientID FROM patients 返回了 NULL 以及其中一个值。是否与后台发生的NULL 值进行比较? 【参考方案1】:

NULL 不是数据类型,您不能使用任何过滤器或子句 IN、NOT IN 等。您必须使用 IS NULLIS NOT NULL 明确排除它> 条件。在这里,您必须执行以下操作才能获得预期的输出。

SELECT DISTINCT ClientID FROM devices WHERE ClientID IS NOT NULL AND ClientID NOT IN ( SELECT DISTINCT ClientID FROM patients WHERE ClientID IS NOT NULL );

【讨论】:

以上是关于WHERE NOT IN 返回一个空集,而它不应该的主要内容,如果未能解决你的问题,请参考以下文章

laravel 选择 where 和 where 条件

BigQuery 错误:遇到““WHERE”“WHERE”“[关闭]

如何反转 numpy.where (np.where) 函数

mongodb 中不用$where的代替

Pandas 掩码 / where 方法与 NumPy np.where

PostgreSQL 中的 WHERE 和 FILTER (WHERE) 有啥区别?