Exemple
J'ai une table
ID myField
------------
1 someValue
2 NULL
3 someOtherValue
et une expression booléenne T-SQL qui peut être évaluée à VRAI, FAUX ou (en raison de la logique ternaire de SQL) INCONNU:
SELECT * FROM myTable WHERE myField = 'someValue'
-- yields record 1
Si je veux obtenir tous les autres enregistrements , je ne peux pas simplement nier l'expression
SELECT * FROM myTable WHERE NOT (myField = 'someValue')
-- yields only record 3
Je sais comment cela se produit (logique ternaire), et je sais comment résoudre ce problème spécifique.
Je sais que je peux simplement utiliser myField = 'someValue' AND NOT myField IS NULL
et j'obtiens une expression "inversible" qui ne donne jamais INCONNU:
SELECT * FROM myTable WHERE NOT (myField = 'someValue' AND myField IS NOT NULL)
-- yields records 2 and 3, hooray!
Cas général
Maintenant, parlons du cas général. Disons qu'au lieu d' myField = 'someValue'
avoir une expression complexe impliquant de nombreux champs et conditions, peut-être des sous-requêtes:
SELECT * FROM myTable WHERE ...some complex Boolean expression...
Existe-t-il un moyen générique pour "inverser" cette expession? Points bonus si cela fonctionne pour les sous-expressions:
SELECT * FROM myTable
WHERE ...some expression which stays...
AND ...some expression which I might want to invert...
Je dois prendre en charge SQL Server 2008-2014, mais s'il existe une solution élégante nécessitant une version plus récente que 2008, je suis également intéressé d'en entendre parler.