Przykład
Mam stolik
ID myField
------------
1 someValue
2 NULL
3 someOtherValue
oraz wyrażenie logiczne T-SQL, które może mieć wartość PRAWDA, FAŁSZ lub (ze względu na logikę potrójną SQL) NIEZNANE:
SELECT * FROM myTable WHERE myField = 'someValue'
-- yields record 1
Jeśli chcę uzyskać wszystkie inne rekordy , nie mogę po prostu zanegować wyrażenia
SELECT * FROM myTable WHERE NOT (myField = 'someValue')
-- yields only record 3
Wiem, dlaczego tak się dzieje (logika trójskładnikowa) i wiem, jak rozwiązać ten konkretny problem.
Wiem, że mogę po prostu użyć myField = 'someValue' AND NOT myField IS NULL
i otrzymuję wyrażenie „odwracalne”, które nigdy nie daje NIEZNANE:
SELECT * FROM myTable WHERE NOT (myField = 'someValue' AND myField IS NOT NULL)
-- yields records 2 and 3, hooray!
Ogólna sprawa
Porozmawiajmy teraz o ogólnym przypadku. Powiedzmy, że zamiast myField = 'someValue'
mam złożone wyrażenie obejmujące wiele pól i warunków, być może podkwerend:
SELECT * FROM myTable WHERE ...some complex Boolean expression...
Czy istnieje ogólny sposób na „odwrócenie” tej wyprawy? Punkty bonusowe, jeśli działa w przypadku podwyrażeń:
SELECT * FROM myTable
WHERE ...some expression which stays...
AND ...some expression which I might want to invert...
Muszę wesprzeć SQL Server 2008-2014, ale jeśli istnieje eleganckie rozwiązanie wymagające nowszej wersji niż 2008, to też chcę o tym usłyszeć.