Thí dụ
Tôi có một cái bàn
ID myField
------------
1 someValue
2 NULL
3 someOtherValue
và một biểu thức Boolean T-SQL có thể đánh giá thành TRUE, FALSE hoặc (do logic tạm thời của SQL) UNKNOWN:
SELECT * FROM myTable WHERE myField = 'someValue'
-- yields record 1
Nếu tôi muốn nhận tất cả các bản ghi khác , tôi không thể đơn giản phủ nhận biểu thức
SELECT * FROM myTable WHERE NOT (myField = 'someValue')
-- yields only record 3
Tôi biết tại sao điều này xảy ra (logic ternary) và tôi biết cách giải quyết vấn đề cụ thể này.
Tôi biết tôi chỉ có thể sử dụng myField = 'someValue' AND NOT myField IS NULL
và tôi nhận được một biểu thức "không thể đảo ngược" mà không bao giờ mang lại UNKNOWN:
SELECT * FROM myTable WHERE NOT (myField = 'someValue' AND myField IS NOT NULL)
-- yields records 2 and 3, hooray!
Trường hợp chung
Bây giờ, hãy nói về trường hợp chung. Giả sử thay vì myField = 'someValue'
tôi có một số biểu thức phức tạp liên quan đến nhiều trường và điều kiện, có thể là các truy vấn con:
SELECT * FROM myTable WHERE ...some complex Boolean expression...
Có một cách chung để "đảo ngược" sự hết hạn này? Điểm thưởng nếu nó hoạt động cho các biểu hiện phụ:
SELECT * FROM myTable
WHERE ...some expression which stays...
AND ...some expression which I might want to invert...
Tôi cần hỗ trợ SQL Server 2008-2014, nhưng nếu có một giải pháp tao nhã yêu cầu phiên bản mới hơn 2008, tôi cũng muốn nghe về nó.