Приклад
У мене стіл
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, мені також цікаво почути про це.