कैसे एक दृश्य स्तंभ बनाने के लिए नहीं नल


84

मैं एक ऐसा दृश्य बनाने की कोशिश कर रहा हूँ जहाँ मैं चाहता हूँ कि एक कॉलम केवल सही या गलत हो। हालाँकि, ऐसा लगता है कि मैं चाहे जो भी करूं, SQL Server (2008) का मानना ​​है कि मेरा बिट कॉलम किसी तरह से अशक्त हो सकता है।

मेरे पास कॉलम "स्थिति" के साथ "उत्पाद" नामक एक तालिका है जो है INT, NULL। एक दृश्य में, मैं उत्पाद में प्रत्येक पंक्ति के लिए एक पंक्ति लौटना चाहता हूं, यदि उत्पाद में एक BIT कॉलम सही है, तो Product.Status कॉलम 3 के बराबर है, अन्यथा बिट क्षेत्र गलत होना चाहिए।

उदाहरण एसक्यूएल

SELECT CAST( CASE ISNULL(Status, 0)  
               WHEN 3 THEN 1  
               ELSE 0  
             END AS bit) AS HasStatus  
FROM dbo.Product  

यदि मैं इस क्वेरी को एक दृश्य के रूप में सहेजता हूं और ऑब्जेक्ट एक्सप्लोरर में कॉलम को देखता हूं, तो स्तंभ HasStatus सेट हो जाता है BIT, NULL। लेकिन इसे कभी NULL नहीं होना चाहिए। क्या कोई जादू एसक्यूएल ट्रिक है जिसका उपयोग मैं इस कॉलम को करने के लिए मजबूर कर सकता हूं NOT NULL

ध्यान दें कि, यदि मैं CAST()चारों ओर हटाता हूं, तो CASEकॉलम सही तरीके से सेट किया गया है NOT NULL, लेकिन फिर कॉलम का प्रकार सेट किया गया है INT, जो कि वह नहीं है। मैं चाहता हूं कि यह हो BIT। :-)

जवाबों:


150

आप अपनी क्वेरी को थोड़ा व्यवस्थित करके फिर से जो चाहें हासिल कर सकते हैं। चाल यह है कि ISNULLSQL सर्वर को समझने से पहले बाहर की ओर होना चाहिए कि परिणामी मूल्य कभी नहीं हो सकता है NULL

SELECT ISNULL(CAST(
    CASE Status
        WHEN 3 THEN 1  
        ELSE 0  
    END AS bit), 0) AS HasStatus  
FROM dbo.Product  

एक कारण मुझे वास्तव में यह उपयोगी लगता है जब एक ओआरएम का उपयोग किया जाता है और आप परिणामी मान को अशक्त प्रकार के लिए मैप नहीं करना चाहते हैं। यदि आपके एप्लिकेशन का मूल्य कभी संभव नहीं है, तो यह चारों ओर चीजों को आसान बना सकता है। फिर आपको अशक्त अपवादों को संभालने के लिए कोड लिखने की ज़रूरत नहीं है, आदि।


@ गुड़: कोई चिंता नहीं, यह वास्तव में थोड़ा रहस्यमय है। किसी तालिका में परिकलित बिट स्तंभ बनाते समय और परिणाम को अशक्त न करने के लिए उपयोग करना भी आसान है।
RedFilter

8
मुझे कुछ इसी तरह की जरूरत थी, और मैंने पाया कि COALESCE()काम नहीं किया था, आपको वास्तव में उपयोग करना होगाISNULL()
Evilbus22

@ Evilbus22 यह अजीब है, क्योंकि COALESCE और ISNULL दोनों ही NULL को वापस कर सकते हैं। बस एक कंपाइलर क्विक मुझे लगता है।
RedFilter

1
यह एक बार, EntityFramework प्राप्त करने के लिए एक कुंजी का अनुमान लगाने के लिए जब एक सामान्य रूप से अनुमान नहीं होगा।
एरिक

1
इसे भी देखें: dba.stackexchange.com/questions/114260/…
emragins

3

FYI करें, इस संदेश में चलने वाले लोगों के लिए, कलाकारों के बाहर ISNULL () को जोड़ने / कन्वर्ट करने से आपके दृष्टिकोण पर ऑप्टिमाइज़र गड़बड़ हो सकता है।

इंडेक्स की के समान मान का उपयोग करने वाले हमारे पास 2 टेबल थे लेकिन विभिन्न संख्यात्मक परिशुद्धता (खराब, मुझे पता है) के प्रकारों के साथ और अंतिम परिणाम का उत्पादन करने के लिए हमारा विचार उन पर शामिल हो रहा था। लेकिन हमारा मिडलवेयर कोड एक विशिष्ट डेटा प्रकार की तलाश में था, और दृश्य में एक CONVERT () कॉलम था

मैंने देखा, जैसा कि ओपी ने किया था, कि दृश्य परिणाम के स्तंभ विवरणियों ने इसे अशक्त के रूप में परिभाषित किया था और मैं सोच रहा था कि यह 2 तालिकाओं पर एक प्राथमिक / विदेशी कुंजी है; हम परिणाम को क्यों अशक्त के रूप में परिभाषित करना चाहते हैं?

मुझे यह पोस्ट मिला, स्तंभ और वसीला के चारों ओर ISNULL () फेंक दिया - अब अशक्त नहीं है।

समस्या यह थी कि जब उस स्तंभ पर कोई क्वेरी फ़िल्टर की गई थी, तो दृश्य का प्रदर्शन सीधे शौचालय के नीचे चला गया था।

किसी कारण से, दृश्य के परिणाम कॉलम पर एक स्पष्ट CONVERT () ने अनुकूलक को खराब नहीं किया (यह वैसे भी करना था क्योंकि अलग-अलग पूर्वाग्रहों के कारण) लेकिन एक निरर्थक ISNULL () आवरण जोड़कर एक बड़ा किया मार्ग।


क्या आप CONVERT()उदाहरण के साथ गैर-अशक्तता को सुनिश्चित / इंगित करने के लिए समाधान दिखा सकते हैं , कृपया?
या मैपर

1
हाय OR - माफ करना, मैंने इसे कुछ समय के लिए नहीं देखा। यहाँ एक उदाहरण है। यदि आपके पास CONVERT (BIT, U.RETIRED), 0) आपके विचार में सेवानिवृत्त हो गया है, तो बाइट या इंट कॉलम को बिट / बूल में बदलकर कहें, तो यह अशक्त हो जाता है। आप उस कॉलम को ISNULL (CONVERT (BIT, U.RETIRED), 0) AS रिटायर्ड के साथ बदलकर गैर-अशक्त बना सकते हैं। यदि U.RETIRED शुरू करने के लिए अशक्त नहीं था, तो यह कार्यात्मक रूप से दृश्य में कॉलम को छोड़कर कुछ भी नहीं बदलता है। चेतावनी: ISNULL () क्वेरी अनुकूलन और संकेतों की पसंद के साथ हस्तक्षेप कर सकता है।
user1664043

-3

आप एक चयन कथन में कर सकते हैं वह डेटा जो डेटाबेस इंजन आपको क्लाइंट के रूप में भेजता है उसे नियंत्रित करता है। अंतर्निहित तालिका की संरचना पर चयन कथन का कोई प्रभाव नहीं है। तालिका संरचना को संशोधित करने के लिए आपको एक अलर्ट तालिका विवरण निष्पादित करना होगा।

  1. पहले यह सुनिश्चित करें कि वर्तमान में तालिका में उस बिट फ़ील्ड में कोई नल नहीं हैं
  2. फिर निम्नलिखित ddl स्टेटमेंट को निष्पादित करें: Alter Table dbo.Product Alter column status bit not null

यदि, ओटोह, आप जो कुछ करने की कोशिश कर रहे हैं, वह दृश्य के आउटपुट को नियंत्रित करता है, तो आप जो कर रहे हैं वह पर्याप्त है। आपका सिंटैक्स इस बात की गारंटी देगा कि व्यूस्सेट में हैसटस कॉलम का आउटपुट वास्तव में कभी भी अशक्त नहीं होगा। यह हमेशा या तो बिट मान = 1 या बिट मान = 0. चिंता नहीं करेगा कि वस्तु एक्सप्लोरर क्या कहता है ...


6
मैं टेबल कॉलम नहीं बदलना चाहता। स्तंभ को पूर्णांक स्तंभ के रूप में परिभाषित किया गया है, जो अशक्त होने की अनुमति देता है। यह हमारी कल्पना पर खरा उतरता है। लेकिन मुझे एक ऐसे दृश्य की आवश्यकता है जो एक स्तंभ को थोड़े से क्षेत्र के साथ लौटाता है, जो अशक्त नहीं हो सकता। यह पर्याप्त नहीं है कि मुझे पता है कि यह अशक्त नहीं हो सकता है, कॉलम को NULL नहीं होना है, ताकि यह हमारे ORM में सही रूप से मैप हो सके।
रेने
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.