Esempio
Ho un tavolo
ID myField
------------
1 someValue
2 NULL
3 someOtherValue
e un'espressione booleana T-SQL che può valutare su VERO, FALSO o (a causa della logica ternaria di SQL) SCONOSCIUTO:
SELECT * FROM myTable WHERE myField = 'someValue'
-- yields record 1
Se voglio ottenere tutti gli altri record , non posso semplicemente negare l'espressione
SELECT * FROM myTable WHERE NOT (myField = 'someValue')
-- yields only record 3
So come ciò accada (logica ternaria) e so come risolvere questo problema specifico.
So che posso semplicemente usare myField = 'someValue' AND NOT myField IS NULL
e ottengo un'espressione "invertibile" che non produce mai SCONOSCIUTO:
SELECT * FROM myTable WHERE NOT (myField = 'someValue' AND myField IS NOT NULL)
-- yields records 2 and 3, hooray!
Caso generale
Ora parliamo del caso generale. Diciamo invece myField = 'someValue'
che ho un'espressione complessa che coinvolge molti campi e condizioni, forse sottoquery:
SELECT * FROM myTable WHERE ...some complex Boolean expression...
Esiste un modo generico per "invertire" questa espansione? Punti bonus se funziona per le sottoespressioni:
SELECT * FROM myTable
WHERE ...some expression which stays...
AND ...some expression which I might want to invert...
Devo supportare SQL Server 2008-2014, ma se esiste una soluzione elegante che richiede una versione più recente rispetto al 2008, sono interessato anche a sentirne parlare.