Ejemplo
Tengo una mesa
ID myField
------------
1 someValue
2 NULL
3 someOtherValue
y una expresión booleana T-SQL que puede evaluar como VERDADERO, FALSO o (debido a la lógica ternaria de SQL) DESCONOCIDO:
SELECT * FROM myTable WHERE myField = 'someValue'
-- yields record 1
Si quiero obtener todos los demás registros , no puedo simplemente negar la expresión
SELECT * FROM myTable WHERE NOT (myField = 'someValue')
-- yields only record 3
Sé cómo sucede esto (lógica ternaria) y sé cómo resolver este problema específico.
Sé que puedo usar myField = 'someValue' AND NOT myField IS NULL
y obtengo una expresión "invertible" que nunca produce DESCONOCIDO:
SELECT * FROM myTable WHERE NOT (myField = 'someValue' AND myField IS NOT NULL)
-- yields records 2 and 3, hooray!
Caso general
Ahora, hablemos del caso general. Digamos que en lugar de myField = 'someValue'
tener una expresión compleja que involucra muchos campos y condiciones, quizás subconsultas:
SELECT * FROM myTable WHERE ...some complex Boolean expression...
¿Hay alguna forma genérica de "invertir" esta expresión? Puntos de bonificación si funciona para subexpresiones:
SELECT * FROM myTable
WHERE ...some expression which stays...
AND ...some expression which I might want to invert...
Necesito admitir SQL Server 2008-2014, pero si hay una solución elegante que requiera una versión más nueva que la de 2008, también estoy interesado en conocerla.