0

我的原始查询返回 7975 行。添加 where 子句,我收到 7917 行。我想要SELECT58 行的差异。为了做到这一点,我写了我认为是反向的 where 子句。不幸的是,我只看到 41 行,而不是预期的 58 行。

TableName.Column 和 TableName.Column2 都可以为空。

原来在哪里

where ((TableName.Column in ('1', '2', '3))
or (TableName.Column2 in ('1', '2', '3))

我的逆向尝试

where ((TableName.Column not in ('1', '2', '3))
and (TableName.Column2 not in ('1', '2', '3))
4

4 回答 4

2
SELECT 
    * 
FROM 
    TableName 
EXCEPT 
SELECT 
    * 
FROM 
    TableName 
WHERE 
    ((TableName.Column IN ('1', '2', '3))
    OR (TableName.Column2 IN ('1', '2', '3))

顺便说一句,我怀疑 NULL 值会影响您的结果。空值不是IN,它们也不NOT IN是特定的集合。

于 2012-08-14T15:32:20.793 回答
1

你的问题是NULL。真正的逆是:

where (coalesce(TableName.Column, '') not in ('1', '2', '3))

或者:

where tableName is NULL or (TableName.Column not in ('1', '2', '3))

对于这两列,这将是:

where (coalesce(TableName.Column, '') not in ('1', '2', '3)) and
      (coalesce(TableName.Column2, '') not in ('1', '2', '3)
于 2012-08-14T15:40:27.770 回答
1

如前所述,SQL 的 3-way 逻辑要求null所有测试都失败,除非是明确的无效测试。

如果x为 null 则测试x = 3与 text 一样失败x != 3。此外,测试x = null失败(这不是对无效性的明确测试)。对于空值“正确”成功或失败的唯一测试是 test x is [not] null

SQL Server 的问题在于它的默认行为 WRTnull不能那样工作。

但是,如果您编写 SQL 查询以正确检查 null/non-null,则无论数据库行为如何,查询都将正常工作。

于 2012-08-14T17:18:06.457 回答
0

你在哪里都有一个'和一个)缺失。我想这是一个错字。

所以你原来的查询是:

where ((X) or (Y))

你改成

where ((!X) and (!Y))

这不是一回事。在第一个示例中,只需要满足一个条件来评估查询,因此将返回 Column 上为 1 的行。第二,两者都需要为真,因此它只会返回在第 1 列和第 2 列上没有 1、2 或 3 的行

你究竟需要返回什么?

于 2012-08-14T15:44:03.923 回答