пример
У меня есть стол
ID myField
------------
1 someValue
2 NULL
3 someOtherValue
и логическое выражение T-SQL, которое может принимать значения ИСТИНА, ЛОЖЬ или (из-за троичной логики SQL) НЕИЗВЕСТНО:
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, мне тоже интересно об этом услышать.