ตัวอย่าง
ฉันมีโต๊ะ
ID myField
------------
1 someValue
2 NULL
3 someOtherValue
และนิพจน์ T-SQL Boolean ซึ่งสามารถประเมินค่าเป็น TRUE, FALSE หรือ (เนื่องจากตรรกะที่ประกอบไปด้วยของ SQL) UNKNOWN:
SELECT * FROM myTable WHERE myField = 'someValue'
-- yields record 1
หากฉันต้องการได้รับบันทึกอื่น ๆ ทั้งหมดฉันไม่สามารถปฏิเสธการแสดงออกได้
SELECT * FROM myTable WHERE NOT (myField = 'someValue')
-- yields only record 3
ฉันรู้ว่าทำไมสิ่งนี้จึงเกิดขึ้น (ตรรกะที่สาม) และฉันรู้วิธีแก้ปัญหาเฉพาะนี้
ฉันรู้ว่าฉันสามารถใช้myField = 'someValue' AND NOT myField IS NULL
และฉันได้รับการแสดงออก "ย้อนกลับ" ซึ่งไม่เคยยอมแพ้ UNKNOWN:
SELECT * FROM myTable WHERE NOT (myField = 'someValue' AND myField IS NOT NULL)
-- yields records 2 and 3, hooray!
กรณีทั่วไป
ทีนี้มาพูดถึงกรณีทั่วไปกัน สมมุติว่าmyField = 'someValue'
ฉันมีนิพจน์ที่ซับซ้อนที่เกี่ยวข้องกับฟิลด์และเงื่อนไขจำนวนมากบางทีเคียวรีย่อย:
SELECT * FROM myTable WHERE ...some complex Boolean expression...
มีวิธีทั่วไปในการ "คว่ำ" การถดถอยนี้หรือไม่? คะแนนโบนัสหากใช้กับนิพจน์ย่อย:
SELECT * FROM myTable
WHERE ...some expression which stays...
AND ...some expression which I might want to invert...
ฉันต้องการสนับสนุน SQL Server 2008-2014 แต่ถ้ามีโซลูชันที่หรูหราที่ต้องใช้รุ่นที่ใหม่กว่าปี 2008 ฉันก็อยากจะได้ยินเช่นกัน