उदाहरण
मेरे पास एक टेबल है
ID myField
------------
1 someValue
2 NULL
3 someOtherValue
और एक टी-एसक्यूएल बूलियन अभिव्यक्ति जो 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 की तुलना में एक नए संस्करण की आवश्यकता के लिए एक सुंदर समाधान है, तो मुझे इसके बारे में भी सुनने में दिलचस्पी है।