我的原始查询返回7975行。添加where子句,我收到7917行。我想SELECT
58行差异。为了做到这一点,我写了我认为是反向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))
答案 0 :(得分: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
特定集合。
答案 1 :(得分: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)
答案 2 :(得分:1)
如上所述,SQL的3向逻辑强制要求null
在所有测试中失败,除了对无效的显式测试。
如果x
为空,则测试x = 3
将失败,文本x != 3
也会失败。此外,测试x = null
失败(这不是对无效的明确测试)。成功或失败的唯一测试"正确" for nulls是测试x is [not] null
。
SQL Server的问题是它的默认行为WRT null
不会那样工作。
但是,如果编写SQL查询以正确检查null / non-null,则无论数据库行为如何,查询都将正常工作。
答案 3 :(得分:0)
你的两个人都缺少'
和)
。我想这是一个错字。
所以你的原始查询是:
where ((X) or (Y))
然后你改为
where ((!X) and (!Y))
这不是一回事。在第一个示例中,只有一个条件需要为true才能评估查询,因此将返回Column上1的行。在第二个,两者都需要为真,所以它只返回第1列和第2列没有1,2或3的行
你究竟需要返回什么?