例
我有桌子
ID myField
------------
1 someValue
2 NULL
3 someOtherValue
以及一个T-SQL布尔表达式,其值可以为TRUE,FALSE或(由于SQL的三元逻辑)UNKNOWN:
SELECT * FROM myTable WHERE myField = 'someValue'
-- yields record 1
如果我想获取所有其他记录,则不能简单地取反表达式
SELECT * FROM myTable WHERE NOT (myField = 'someValue')
-- yields only record 3
我知道为什么会这样(三元逻辑),并且我知道如何解决这个特定问题。
我知道我可以使用,myField = 'someValue' AND NOT myField IS NULL
并且得到一个“可逆”表达式,它永远不会产生未知:
SELECT * FROM myTable WHERE NOT (myField = 'someValue' AND myField IS NOT NULL)
-- yields records 2 and 3, hooray!
一般情况
现在,让我们谈谈一般情况。可以说,不是myField = 'someValue'
我有一些涉及很多字段和条件的复杂表达式,也许还有子查询:
SELECT * FROM myTable WHERE ...some complex Boolean expression...
有通用的方法可以“反转”此支出吗?如果它适用于子表达式,则有加分:
SELECT * FROM myTable
WHERE ...some expression which stays...
AND ...some expression which I might want to invert...
我需要支持SQL Server 2008-2014,但是如果有一个优雅的解决方案需要一个比2008年更高的版本,我也很想知道这一点。