क्यों 0 खाली स्ट्रिंग के बराबर है?


23

मुझे यह जानने में कुछ मदद चाहिए कि निम्न T-SQLकथन क्यों लौटाता है 1(सत्य):

SELECT IIF( 0 = '', 1, 0)

मुझे लगता है कि किसी ने एक ANSIविकल्प को बदल दिया है जैसे SET ANSI_NULLSकि या कुछ और जो व्यवहार का कारण बन रहा है।

मेरा मुद्दा यह है कि मैं कुछ मूल्यों में शामिल हो रहा हूं और अंतिम पंक्ति सेट में मेरे पास ऐसे मूल्य हैं जो मूल्यों 0और ''मूल्यों से जुड़ते हैं, जो सही नहीं है।

जवाबों:


31

यह सिर्फ प्रलेखित व्यवहार है। मुझे नहीं लगता कि किसी ने सेटिंग्स के साथ खिलवाड़ किया।

MSDN पर डेटा प्रकार की पूर्ववर्ती स्थिति देखें ।

जब कोई ऑपरेटर अलग-अलग डेटा प्रकारों के दो भावों को जोड़ता है, तो डेटा प्रकार की पूर्ववर्तीता के नियम निर्दिष्ट करते हैं कि निम्न पूर्वता वाला डेटा प्रकार उच्च वरीयता वाले डेटा प्रकार में परिवर्तित हो जाता है।

जैसा कि टिप्पणियों में उल्लेख किया गया है कि खाली स्ट्रिंग किसी भी संख्यात्मक प्रकार में 0 में परिवर्तित हो जाती है और दिनांक में परिवर्तित होने पर 1900-01-01 00: 00: 00.000 तक।

संपादित करें: मुझे लगता है कि आपकी वास्तविक समस्या यह है कि आपका डिज़ाइन इतना है कि आपको एक अलग डेटा प्रकार के क्षेत्रों में शामिल होना है। इसके आस-पास आने का एकमात्र तरीका यह है कि आपके ज्वाइन क्लॉज में एक कन्वर्सेशन हो, जिससे क्वेरी परफॉर्मेंस को नुकसान पहुंचे। मुख्य समस्या संभवतः स्कीमा डिज़ाइन के साथ है

EDIT: उन टिप्पणियों पर बहुत चर्चा हुई, जिन्हें चैट करने के लिए स्थानांतरित किया गया है। हालांकि, यह अतार्किक हो सकता है कि एक खाली स्ट्रिंग को अन्य डेटा प्रकारों में परिवर्तित करने से मनमाना मान उत्पन्न होता है।

यह कोड:

SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')

इस उत्पादन का उत्पादन:

0
0
1900-01-01
1900-01-01 00:00:00.000

आप तब उम्मीद कर सकते हैं कि यह व्यवहार अन्य पूर्ववर्ती डेटाटिप्स के बीच सुसंगत है और उम्मीद करता है कि 0 को एक तिथि में परिवर्तित करने से समान मनमाना मूल्य प्राप्त होगा लेकिन ऐसा नहीं होता है।

SELECT CONVERT(date, 0)

का उत्पादन

डेटा प्रकार इंट से आज तक स्पष्ट रूपांतरण की अनुमति नहीं है।

क्योंकि यह समर्थित रूपांतरण नहीं है

जबकि

SELECT CONVERT(datetime, 0)

रिटर्न

जनवरी, 01 1900 00:00:00

तो हाँ, यह अजीब और मनमाना है, लेकिन वास्तव में दस्तावेज और व्याख्या करने योग्य है।


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस उत्तर के बारे में बातचीत को चैट में स्थानांतरित कर दिया गया है ।
पॉल व्हाइट GoFundMonica कहते

2
क्या व्यवहार CAST('' AS INT)-> 0 कहीं दस्तावेज है? संदर्भ जोड़ दें तो अच्छा होगा।
सलमान ए

2
@ सलमान: इसे चार / वैर डॉक्यूमेंटेशन के " कन्वर्ज़न कैरेक्टर डेटा" खंड में प्रलेखित किया जाना चाहिए , लेकिन वर्तमान में यह नहीं है। मैंने एक प्रतिक्रिया टिप्पणी छोड़ दी है जिसमें इसे शामिल करने के लिए कहा गया है।
हेनजी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.