2012-01-25 9 views
5

मैं बस एक प्रक्रिया के साथ एक दिलचस्प समस्या में आया जो मैं एसक्यूएल में लिख रहा हूं।एसक्यूएल डेट वैरिएबल की तुलना में शून्य तरीके से तुलना क्यों करें?

मेरी प्रो में मेरे पास 2 तिथियां हैं, जो वैकल्पिक पैरा को न्यूल में डिफॉल्ट किया गया है, मैं यह जांचना चाहता हूं कि ये पैराम शून्य नहीं हैं और यदि मेरी proc का हिस्सा नहीं चलाया जाता है, तो यदि वे शून्य हैं तो proc के अतिरिक्त भाग अनदेखा किया जाता है।

मैं एक काफी बुनियादी IF(@dateVariable <> NULL AND @DateVariable2 <> NULL) बयान किया था, लेकिन अगर बयान कभी नहीं काम करता है, भले ही चर रिक्त नहीं कर रहे हैं, मैं एसक्यूएल एक शून्य जो अजीब है, क्योंकि datetime व्यर्थ है करने के लिए तिथि की तुलना करने के लिए संघर्ष कर रहा है ग्रहण करेंगे।

इस के आसपास पाने के लिए मैंने अभी IF(DateVariable IS NOT NULL) किया जो सही तरीके से काम करता है। मैंने IF(ISNULL(@DateVariable,'') <> '') भी सही तरीके से काम किया है जो

तो मेरा सवाल यह है कि पहला IF क्यों काम नहीं करता है, लेकिन दूसरा और तीसरा IF दोनों बिंदुओं को किसी बिंदु पर चर की सामग्री की तुलना में शून्य से तुलना करना चाहिए?

उदाहरण:

----- विफल -----

DECLARE @Date DATETIME 
SET @Date = CURRENT_TIMESTAMP 

IF (@Date <> NULL) 
BEGIN 
    print('a') 
END 

----- काम करता है -----

DECLARE @Date DATETIME 
SET @Date = CURRENT_TIMESTAMP 

IF (ISNULL(@Date,'') <> '') 
BEGIN 
    print('a') 
END 

DECLARE @Date DATETIME 
SET @Date = CURRENT_TIMESTAMP 

IF (@Date IS NOT NULL) 
BEGIN 
    print('a') 
END 
+3

[तीन वैल्यूड लॉजिक] (http://www.simple-talk.com/sql/learn-sql-server/sql-and-the-snare-of-three-valued -लोगिक /) –

+0

'नूल' के बारे में 'अज्ञात फिर भी मूल्य' के रूप में सोचें। '@Date = अज्ञात फिर भी मूल्य' उपज क्या होनी चाहिए? 'TRUE'? 'FALSE'? या 'हम नहीं जानते'? –

उत्तर

13

सीधे शब्दों में कहें 'शून्य 'न्यूल' के बराबर नहीं है। 'न्यूल' अनिश्चितता की स्थिति के बराबर है, जहां एक चीज अनिश्चित है, वह अनिवार्य रूप से कुछ और बराबर नहीं है जो अनिश्चित है। नल के लिए परीक्षण करते समय 'IS NULL', 'ISNULL()', या 'COALESCE()' का उपयोग करें। ANSI_NULLS को 'ऑफ' पर सेट करना इस व्यवहार को बदल सकता है, लेकिन यह एएनएसआई एसक्यूएल मानक नहीं है। अधिक जानकारी के लिए http://msdn.microsoft.com/en-us/library/ms191270.aspx देखें।

4

शून्य मूल्यों की तुलना करते समय देखभाल की जानी चाहिए। तुलना का व्यवहार SET ANSI_NULLS विकल्प की सेटिंग पर निर्भर करता है।

जब SET ANSI_NULLS चालू है, तो तुलनात्मक रूप से अभिव्यक्तियों में से एक या अधिक NULL या तो सत्य या गलत नहीं होता है; यह UNKNOWN उत्पन्न करता है। ऐसा इसलिए है क्योंकि अज्ञात मान को किसी अन्य मूल्य के विरुद्ध तार्किक रूप से तुलना नहीं किया जा सकता है। ऐसा तब होता है जब अभिव्यक्ति की तुलना शाब्दिक न्यूल से की जाती है, या यदि दो अभिव्यक्तियों की तुलना से की जाती है और उनमें से एक न्यूल का मूल्यांकन करता है।

देखें NULL Comparison Search Conditions

+2

'सेट ANSI_NULLS OFF' बहिष्कृत है। http://msdn.microsoft.com/en-us/library/ms143729.aspx –

संबंधित मुद्दे