2010-02-24 38 views
65

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

मैं एक तालिका स्तंभ "स्थिति" जो INT, NULL है साथ "उत्पाद" कहा जाता है। एक दृश्य में, मैं उत्पाद में प्रत्येक पंक्ति के लिए एक पंक्ति वापस करना चाहता हूं, यदि उत्पाद। स्टेटस कॉलम 3 के बराबर है, तो बीआईटी कॉलम को सही पर सेट किया गया है, अन्यथा बिट फ़ील्ड गलत होना चाहिए।

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

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

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

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

+0

@Gunder: +1, StackOverflow करने के लिए आपका स्वागत है। मैं आपके सवाल का स्वरूपित किया, स्वरूपण :) –

+0

आह के बारे में पता लगाने के लिए यह पर एक नजर है, मैं कोड से पहले एक और लाइन ब्रेक की जरूरत है। धन्यवाद। :-) –

उत्तर

119

आप प्राप्त कर सकते हैं आपकी क्वेरी एक सा फिर से व्यवस्थित करके आप क्या चाहते हो जाएगा। चाल है कि ISNULL बाहर की दुनिया में होने के लिए पहले एसक्यूएल सर्वर समझ जाएगा कि जिसके परिणामस्वरूप मूल्य NULL कभी नहीं हो सकता है।

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

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

+0

यह काम करता है! - बहुत बहुत धन्यवाद! - हालांकि मैं थोड़ा शर्मिंदा हूं, कि मैंने पहले कोशिश नहीं की थी। :-) –

+0

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

+4

मुझे कुछ इसी तरह की ज़रूरत थी, और मैंने पाया कि 'COALESCE()' काम नहीं करता है, आपको वास्तव में * ISNULL() ' – EvilBob22

-1

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

  1. पहले सुनिश्चित करें कि वर्तमान में है कि बिट क्षेत्र में कोई nulls तालिका
  2. तो निम्न DDL कथन पर अमल कर रहे हैं कि सुनिश्चित करें: Alter Table dbo.Product Alter column status bit not null

OTOH, तुम सब करने की कोशिश कर रहे हैं, तो दृश्य के आउटपुट को नियंत्रित करता है, फिर आप जो कर रहे हैं वह पर्याप्त है। आपका वाक्य रचना की गारंटी देगा कि विचारों resultset में HasStatus स्तंभ के उत्पादन में तथ्य में कभी नहीं अशक्त हो होगा। यह हमेशा या तो थोड़ा मूल्य = 1 या बिट मूल्य = 0. चिंता मत करो क्या वस्तु एक्सप्लोरर कहते हैं ...

+5

मैं तालिका कॉलम को बदलना नहीं चाहता हूं। कॉलम को एक पूर्णांक स्तंभ के रूप में परिभाषित किया गया है, जो शून्य की अनुमति देता है। यह हमारे spec फिट बैठता है। लेकिन मुझे एक ऐसे दृश्य की ज़रूरत है जो एक छोटे से क्षेत्र के साथ एक कॉलम लौटाता है, जो शून्य नहीं हो सकता है। यह पर्याप्त नहीं है कि मुझे पता है कि यह शून्य नहीं हो सकता है, कॉलम को पूर्ण नहीं होना चाहिए, ताकि यह हमारे ओआरएम में सही तरीके से मैप करे। –

0

इस कोड का उपयोग मैं है लिखने के लिए नहीं है, यह आईडी स्तंभ नहीं NULL और अन्य सभी लोगों को शून्य कर देगा। आपको बिट या वर्कर कॉलम डालना है, और int कॉलम की तुलना NULL से करें।

CREATE TABLE [dbo].[aTestTable](
    [ID] [int] NOT NULL, 
    [varcharCol] [varchar](50) NOT NULL, 
    [nullvarcharCol] [varchar](50) NULL, 
    [bitCol] [bit] NOT NULL, 
    [nullbitCol] [bit] NULL, 
    [intCol] [int] NOT NULL, 
    [nullintCol] [int] NULL, 
CONSTRAINT [PK_aTestTable] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 


CREATE VIEW [dbo].[aTestView] 
AS 
SELECT ID , 
     NULLIF(varcharCol , '') AS varcharCol , 
     NULLIF(CAST(varcharCol AS VARCHAR), null) AS varcharCol1, --better 
     nullvarcharCol , 
     NULLIF(CAST(bitCol AS INT), null) AS bitCol , 
     nullbitCol , 
     NULLIF(CAST(intCol AS INT), NULL) AS intCol , 
     nullintCol 
FROM dbo.aTestTable 


Sample Data: 

ID varcharCol nullvarcharCol bitCol nullbitCol intCol nullintCol 
1 1 1 1 1 1 1 
2 0 0 0 0 0 0 
3 0 NULL 0 NULL 0 NULL 
4 a a 1 1 2 2 

hth

3

FYI करें, इस संदेश में चल रहे लोगों के लिए, IsNull() कलाकारों के बाहर चारों ओर जोड़ने/गड़बड़ कर सकते हैं आपके विचार पर अनुकूलक परिवर्तित।

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

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

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

समस्या को देखने का प्रदर्शन सीधे शौचालय जब एक प्रश्न है कि स्तंभ पर फ़िल्टर नीचे चला गया था।

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

+0

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

+1

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

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