例
テーブルがあります
ID myField
------------
1 someValue
2 NULL
3 someOtherValue
そして、TRUE、FALSE、または(SQLの3値論理による)UNKNOWNに評価できるT-SQLブール式:
SELECT * FROM myTable WHERE myField = 'someValue'
-- yields record 1
他のすべてのレコードを取得する場合、式を単純に否定することはできません
SELECT * FROM myTable WHERE NOT (myField = 'someValue')
-- yields only record 3
なぜこれが発生するのか(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より新しいバージョンを必要とするエレガントなソリューションがある場合は、それについても知りたいです。