Misal
Masam var
ID myField
------------
1 someValue
2 NULL
3 someOtherValue
ve DOĞRU, YANLIŞ veya (SQL'in üçlü mantığı nedeniyle) olarak değerlendirilebilecek bir T-SQL Boole ifadesi BİLİNMEYEN:
SELECT * FROM myTable WHERE myField = 'someValue'
-- yields record 1
Diğer tüm kayıtları almak istersem , ifadeyi basitçe reddedemem
SELECT * FROM myTable WHERE NOT (myField = 'someValue')
-- yields only record 3
Bunun neden olduğunu (üçlü mantık) ve bu özel sorunun nasıl çözüleceğini biliyorum.
Ben sadece kullanabilirsiniz biliyorum myField = 'someValue' AND NOT myField IS NULL
ve ben asla bilinmeyen verir bir "tersine çevrilebilir" ifade olsun:
SELECT * FROM myTable WHERE NOT (myField = 'someValue' AND myField IS NOT NULL)
-- yields records 2 and 3, hooray!
Genel dava
Şimdi genel durum hakkında konuşalım. Diyelim ki myField = 'someValue'
çok fazla alan ve koşul içeren bazı karmaşık ifadelerim var, belki alt sorgular:
SELECT * FROM myTable WHERE ...some complex Boolean expression...
Bu yolculuğu "tersine çevirmenin" genel bir yolu var mı? Alt ifadeler için çalışıyorsa bonus puanları:
SELECT * FROM myTable
WHERE ...some expression which stays...
AND ...some expression which I might want to invert...
SQL Server 2008-2014'ü desteklemem gerekiyor, ancak 2008'den daha yeni bir sürüm gerektiren zarif bir çözüm varsa, bunu da duymak istiyorum.