Exemplo
Eu tenho uma mesa
ID myField
------------
1 someValue
2 NULL
3 someOtherValue
e uma expressão booleana T-SQL que pode ser avaliada como TRUE, FALSE ou (devido à lógica ternária do SQL) UNKNOWN:
SELECT * FROM myTable WHERE myField = 'someValue'
-- yields record 1
Se eu quiser obter todos os outros registros , não posso simplesmente negar a expressão
SELECT * FROM myTable WHERE NOT (myField = 'someValue')
-- yields only record 3
Eu sei como isso acontece (lógica ternária) e sei como resolver esse problema específico.
Eu sei que posso apenas usar myField = 'someValue' AND NOT myField IS NULL
e recebo uma expressão "invertível" que nunca produz UNKNOWN:
SELECT * FROM myTable WHERE NOT (myField = 'someValue' AND myField IS NOT NULL)
-- yields records 2 and 3, hooray!
Caso Geral
Agora, vamos falar sobre o caso geral. Digamos que em vez de myField = 'someValue'
eu tenho uma expressão complexa envolvendo muitos campos e condições, talvez subconsultas:
SELECT * FROM myTable WHERE ...some complex Boolean expression...
Existe uma maneira genérica de "inverter" essa expulsão? Pontos de bônus se funcionar para subexpressões:
SELECT * FROM myTable
WHERE ...some expression which stays...
AND ...some expression which I might want to invert...
Preciso dar suporte ao SQL Server 2008-2014, mas se houver uma solução elegante que exija uma versão mais recente que 2008, também estou interessado em saber sobre isso.