Mysql 请求不在空集中的项目时返回空集
我有一个查询,它的行为方式是我本不期望的 我有两个表,stagin_用户和用户。在这两个表中,我都有一个名为name的列。在users表中,name的每个值都为NULL。在staging_用户中,我有13行没有空值。我试图运行一个查询,从中获取临时表中名称不在users表中的所有用户 我的书面询问是: 选择名称 来自临时用户 其中名称不在“从用户中选择名称”中 在编写查询时,我没有得到任何结果。这种行为的原因是什么 由于users表中只有空值,我知道我可以说name不为空,我会得到相同的结果,但我希望此查询针对表中的值,这些值恰好都为空。来自: 为了符合SQL标准,IN不仅在左侧的表达式为NULL时返回NULL,而且在列表中找不到匹配项且列表中的一个表达式为NULL时也返回NULL 及 expr不在值中,。。。在值方面与NOT expr相同 因此,当您选择空值时。。NOT IN返回NULL。。所以没有行匹配 你可以这样纠正:Mysql 请求不在空集中的项目时返回空集,mysql,Mysql,我有一个查询,它的行为方式是我本不期望的 我有两个表,stagin_用户和用户。在这两个表中,我都有一个名为name的列。在users表中,name的每个值都为NULL。在staging_用户中,我有13行没有空值。我试图运行一个查询,从中获取临时表中名称不在users表中的所有用户 我的书面询问是: 选择名称 来自临时用户 其中名称不在“从用户中选择名称”中 在编写查询时,我没有得到任何结果。这种行为的原因是什么 由于users表中只有空值,我知道我可以说name不为空,我会得到相同的结果,但
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的可能重复项被视为未知项,这使查询排序无效。