Contoh
Saya punya meja
ID myField
------------
1 someValue
2 NULL
3 someOtherValue
dan ekspresi T-SQL Boolean yang dapat mengevaluasi menjadi BENAR, SALAH atau (karena logika ternary SQL) DIKETAHUI:
SELECT * FROM myTable WHERE myField = 'someValue'
-- yields record 1
Jika saya ingin mendapatkan semua catatan lain , saya tidak bisa begitu saja meniadakan ekspresi
SELECT * FROM myTable WHERE NOT (myField = 'someValue')
-- yields only record 3
Saya tahu mengapa ini terjadi (logika ternary), dan saya tahu bagaimana menyelesaikan masalah khusus ini.
Saya tahu saya hanya bisa menggunakan myField = 'someValue' AND NOT myField IS NULL
dan saya mendapatkan ekspresi "tidak bisa dibalik" yang tidak pernah menghasilkan UNKNOWN:
SELECT * FROM myTable WHERE NOT (myField = 'someValue' AND myField IS NOT NULL)
-- yields records 2 and 3, hooray!
Kasus Umum
Sekarang, mari kita bicara tentang kasus umum. Katakanlah alih-alih myField = 'someValue'
saya memiliki ekspresi kompleks yang melibatkan banyak bidang dan kondisi, mungkin subquery:
SELECT * FROM myTable WHERE ...some complex Boolean expression...
Apakah ada cara generik untuk "membalikkan" pengungkapan ini? Poin bonus jika berfungsi untuk subekspresi:
SELECT * FROM myTable
WHERE ...some expression which stays...
AND ...some expression which I might want to invert...
Saya perlu mendukung SQL Server 2008-2014, tetapi jika ada solusi elegan yang membutuhkan versi yang lebih baru dari 2008, saya tertarik untuk mendengarnya juga.