Mysql 请求不在空集中的项目时返回空集

Mysql 请求不在空集中的项目时返回空集,mysql,Mysql,我有一个查询,它的行为方式是我本不期望的 我有两个表,stagin_用户和用户。在这两个表中,我都有一个名为name的列。在users表中,name的每个值都为NULL。在staging_用户中,我有13行没有空值。我试图运行一个查询,从中获取临时表中名称不在users表中的所有用户 我的书面询问是: 选择名称 来自临时用户 其中名称不在“从用户中选择名称”中 在编写查询时,我没有得到任何结果。这种行为的原因是什么 由于users表中只有空值,我知道我可以说name不为空,我会得到相同的结果,但

我有一个查询,它的行为方式是我本不期望的

我有两个表,stagin_用户和用户。在这两个表中,我都有一个名为name的列。在users表中,name的每个值都为NULL。在staging_用户中,我有13行没有空值。我试图运行一个查询,从中获取临时表中名称不在users表中的所有用户

我的书面询问是:

选择名称 来自临时用户 其中名称不在“从用户中选择名称”中

在编写查询时,我没有得到任何结果。这种行为的原因是什么

由于users表中只有空值,我知道我可以说name不为空,我会得到相同的结果,但我希望此查询针对表中的值,这些值恰好都为空。

来自:

为了符合SQL标准,IN不仅在左侧的表达式为NULL时返回NULL,而且在列表中找不到匹配项且列表中的一个表达式为NULL时也返回NULL

expr不在值中,。。。在值方面与NOT expr相同

因此,当您选择空值时。。NOT IN返回NULL。。所以没有行匹配

你可以这样纠正:

SELECT name 
  FROM staging_users 
 WHERE name IS NOT NULL
   AND name NOT IN (
   SELECT name 
     FROM users 
    WHERE name IS NOT NULL
       );
或者,同样的逻辑:

   SELECT su.name 
     FROM staging_users su
LEFT JOIN users u
       ON u.name = su.name
      AND su.name IS NOT NULL
      AND u.name IS NOT NULL;
另外,我要严肃地质疑允许用户使用空名称的数据结构。。如果更改,您的原始查询将生效。

来自:

为了符合SQL标准,IN不仅在左侧的表达式为NULL时返回NULL,而且在列表中找不到匹配项且列表中的一个表达式为NULL时也返回NULL

expr不在值中,。。。在值方面与NOT expr相同

因此,当您选择空值时。。NOT IN返回NULL。。所以没有行匹配

你可以这样纠正:

SELECT name 
  FROM staging_users 
 WHERE name IS NOT NULL
   AND name NOT IN (
   SELECT name 
     FROM users 
    WHERE name IS NOT NULL
       );
或者,同样的逻辑:

   SELECT su.name 
     FROM staging_users su
LEFT JOIN users u
       ON u.name = su.name
      AND su.name IS NOT NULL
      AND u.name IS NOT NULL;

另外,我要严肃地质疑允许用户使用空名称的数据结构。。如果更改,原始查询将正常工作。

不存在通常是此类查询的更好选项。当使用可能为空的值时,NOT IN往往本质上是不安全的。有关更多详细信息,请参阅以下链接


对于这种类型的查询,NOT EXISTS通常是更好的选择。当使用可能为空的值时,NOT IN往往本质上是不安全的。有关更多详细信息,请参阅以下链接

NULL的可能重复项被视为未知项,这使查询排序无效。NULL的可能重复项被视为未知项,这使查询排序无效。