Beispiel
Ich habe einen Tisch
ID myField
------------
1 someValue
2 NULL
3 someOtherValue
und ein boolescher T-SQL-Ausdruck, der als TRUE, FALSE oder (aufgrund der ternären Logik von SQL) UNBEKANNT ausgewertet werden kann:
SELECT * FROM myTable WHERE myField = 'someValue'
-- yields record 1
Wenn ich alle anderen Datensätze erhalten möchte , kann ich den Ausdruck nicht einfach negieren
SELECT * FROM myTable WHERE NOT (myField = 'someValue')
-- yields only record 3
Ich weiß, warum dies geschieht (ternäre Logik), und ich weiß, wie ich dieses spezielle Problem lösen kann.
Ich weiß, dass ich nur verwenden kann myField = 'someValue' AND NOT myField IS NULL
und ich bekomme einen "invertierbaren" Ausdruck, der niemals UNBEKANNT ergibt:
SELECT * FROM myTable WHERE NOT (myField = 'someValue' AND myField IS NOT NULL)
-- yields records 2 and 3, hooray!
Allgemeiner Fall
Lassen Sie uns nun über den allgemeinen Fall sprechen. Lassen Sie uns sagen , anstatt myField = 'someValue'
ich etwas komplexer Ausdruck haben viele Felder und Bedingungen , die, vielleicht Subqueries:
SELECT * FROM myTable WHERE ...some complex Boolean expression...
Gibt es eine generische Möglichkeit, diese Expedition "umzukehren"? Bonuspunkte, wenn es für Unterausdrücke funktioniert:
SELECT * FROM myTable
WHERE ...some expression which stays...
AND ...some expression which I might want to invert...
Ich muss SQL Server 2008-2014 unterstützen, aber wenn es eine elegante Lösung gibt, die eine neuere Version als 2008 erfordert, bin ich auch daran interessiert, davon zu hören.