2013-02-05 16 views
17

मेरे पास SQL ​​सर्वर 2012 डेटाबेस में किसी तालिका पर थोड़ा कॉलम है।पूर्ण बनाम <> 1 एसक्यूएल बिट

मैं उन सभी पंक्तियों को पुनर्प्राप्त करने का प्रयास कर रहा हूं जहां यह बिट कॉलम NULL या सत्य नहीं है।

इस क्वेरी को वापस लाने नहीं पड़ता कि यह होना चाहिए: (रिटर्न 0 पंक्तियों)

Select * 
from table 
where bit_column_value <> 1 

इस क्वेरी सही पंक्तियों वापस लाता है:

Select * 
from table 
where bit_column_value IS NULL 

अब, मैं उपयोग करने के लिए खुशी होगी दूसरी क्वेरी, लेकिन मेरी समस्या यह है कि, किसी अन्य तालिका के लिए एक समान क्वेरी में, उपर्युक्त के विपरीत सत्य है, जहां पहला तरीका काम करता है, लेकिन दूसरा तरीका नहीं है!

क्या कोई उपरोक्त में क्या अंतर है, यह समझाने में सहायता कर सकता है? मैंने विशेष रूप से प्रासंगिक बिट कॉलम को पूर्ण होने के लिए अद्यतन किया है और यह परिणाम नहीं बदलता है। (सोचा हो सकता है "खाली" और Null मूल्यों के बीच एक अंतर था

कोई स्पष्टीकरण के लिए अग्रिम धन्यवाद

उत्तर

22

कारण <> नहीं करता है काम नहीं है कि एसक्यूएल NULL अज्ञात के रूप में व्यवहार करता है - यह नहीं जानता कि NULL का क्या मतलब है, इसलिए यह = औरदोनों का मूल्यांकन करता हैNULL पर UNKNOWN पर मूल्य (जिसे किसी खंड या जुड़ने की स्थिति में झूठा माना जाता है)। अधिक जानकारी के लिए, इसे पढ़ें: Why does NULL = NULL evaluate to false in SQL server

अगर कोई उस पर एक सूचकांक, IsNull फ़ंक्शन का उपयोग सूचकांक मतलब होगा है, नहीं किया जा सकता इसलिए करने के लिए क्वेरी सुनिश्चित सूचकांक का उपयोग कर सकते सिर्फ OR का उपयोग करें:

SELECT * 
FROM TableName 
WHERE 
    bit_column_value IS NULL OR bit_column_value = 0 
+0

दरअसल, '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' FALSE'। लेकिन परिणाम 'WHERE' खंड में समान है, दोनों पंक्तियां खारिज कर दी गई हैं, केवल' TRUE' पास हैं। –

+0

हाँ आप सही हैं, लेकिन मैं जहां खंड या स्थिति में शामिल होने के परिणाम के लिए परिणाम का जिक्र कर रहा था। जवाब में इसे स्पष्ट किया है। –

6

आपका सर्वश्रेष्ठ दांव जैसे क्वेरी लिखने के लिए होगा:।।

SELECT 
    * 
FROM 
    table 
WHERE 
    ISNULL(bit_column_value, 0) = 0 

यह सभी शून्य और असत्य रिकॉर्ड लौटना चाहिए।

अपनी मेज संरचना और डेटा दिखाई दे रहा बिना, मैं वास्तव में क्यों आप अपने 2 प्रश्नों से अलग परिणाम हो रही है पर कोई टिप्पणी नहीं कर सकते हैं।

1

यदि आपके पास मूल्य = 0 है तो कृपया अपना टेबल डेटा जांचें?

SQL Bit data type केवल मान 0, 1 या NULL हो सकता है, यदि आप अन्य मान सम्मिलित है, यह 1 करने के लिए माना जाता है (अपवाद: आप सम्मिलित हैं 'False' यह 0 बन गया है, 'True' 1 बन जाएगा)।

उदाहरण के लिए:

insert into t1 values (1),(2),(1),(3),(-1),(0),(NULL),('false'),('true') 

परिणाम:

1, 1, 1, 1, 1, 0, शून्य, 0, 1

1

मुझे लगता है यह है क्योंकि इस डेटा में सभी डेटा NULL मान हैं।तो:

Select * 
from table 
where bit_column_value <> 1; 

आपको परिणाम नहीं देगा। चूंकि NULL अज्ञात है। और यह:

Select * 
from table 
where bit_column_value IS NULL; 

आपको वह परिणाम देगा जो आप ढूंढ रहे हैं।

लेकिन आप सच और झूठी का प्रतिनिधित्व bit डेटा प्रकार का उपयोग करने का एक गलत धारणा है।

आप झूठीNULL के रूप में प्रतिनिधित्व कर रहे हैं, 0 खाली है और सच किसी अन्य मूल्य है। bit डेटा प्रकार @IswantoSan explained in his answer के रूप में काम करता है; यह 0 या 1 या NULL होना चाहिए:

  • 0 गलत है,
  • 1 सच है,
  • NULL खाली है।

इसलिए प्राप्त करने के लिए:

  • true मूल्यों where bit_column_value = 1 का उपयोग करें।
  • false मान where bit_column_value = 0 का उपयोग करते हैं।
  • NULL या खाली where bit_column_value IS NULL
  • NULL or not true: जहां bit_column_value ISUL या bit_column_value = 0` है।

दूसरी बात यह है कि NULL और खाली दो अलग-अलग चीजें हैं, वे समान नहीं हैं। BIT डेटा प्रकार खाली होने पर NULL 0 नहीं है, क्योंकि 0 को गलत माना जाता है। लेकिन उदाहरण के लिए VARCHAR जैसे स्ट्रिंग डेटा प्रकार पर विचार करें, तो खाली स्ट्रिंग ''NULL मान से बिल्कुल अलग है।

2

एमएसडीएन का कहना है कि BIT प्रकार मान 0, 1 या NULL स्टोर कर सकता है। (तथ्य यह है कि एक सा मूल्य, शून्य ही बिट मूल्य से अलग से संग्रहीत किया जाना चाहिए है बिट मूल्यों संकुचित किया जा सकता है के बाद से तो यह है कि 8 बिट मूल्यों एक बाइट में संग्रहीत हैं।)

याद रखें कि एक कहां खंड में एक शर्त स्थिति सही होने पर एक पंक्ति का चयन करता है। अधिकांश बाइनरी भविष्यवाणियों (शर्तों) के लिए, यदि आप कुछ मूल्य के साथ न्यूल की तुलना करते हैं, तो परिणाम नल या अनन्य (सत्य नहीं) है। इसलिए, उदाहरण के लिए, यदि कॉलम में मान शून्य है, तो column = 0 न्यूल या अनकॉन्ने का मूल्यांकन करता है, और column <> 0 भी करता है।

आपके प्रश्नों को देखते हुए:

SELECT * FROM table WHERE bit_column_value <> 1 

कहाँ bit_column_value स्तंभ में मान 1 है, हालत गलत तो पंक्ति वापस नहीं किए गए है, जहां मान 0 है, स्थिति सत्य है इसलिए पंक्ति वापस आती है; और जहां मूल्य शून्य है, स्थिति भी पूर्ण या अज्ञात है इसलिए पंक्ति वापस नहीं आती है।

SELECT * FROM table WHERE bit_column_value IS NULL 

SQL मानक के अनुसार, [नहीं] शून्य विधेय, और संबंधित है [नहीं] {सही | FALSE | अज्ञात} विधेय, थोड़े अलग हैं। आईएस नल परीक्षण सही लौटाता है यदि परीक्षण मूल्य शून्य है; अन्यथा, वे गलत लौटते हैं (और कभी भी अनन्य नहीं लौटाते हैं)। आईएस [नहीं] {TRUE | FALSE | UNKNOWN} परीक्षण समान हैं; यदि मान निर्दिष्ट प्रकार का है और अन्यथा गलत है (UNKNOWN नहीं) तो वे सत्य लौटते हैं। उदाहरण के लिए:

Column IS TRUE IS FALSE IS UNKNOWN IS NOT TRUE IS NOT FALSE IS NOT UNKNOWN 
FALSE FALSE  TRUE  FALSE  TRUE   FALSE   TRUE 
TRUE  TRUE  FALSE  FALSE  FALSE   TRUE   TRUE 
NULL  FALSE  FALSE  TRUE   TRUE   TRUE   FALSE 

तो, अपने दूसरे प्रश्न में, केवल पंक्तियों जहां bit_column_value Null मूल्य (जो दोनों 0 से अलग है और 1) का चयन किया जाएगा है - सही, और न ही गलत नहीं।


मैं सभी पंक्तियों जहां इस बिट कॉलम को या तो शून्य या नहीं सही है प्राप्त करने का प्रयास कर रहा हूँ।

प्रयास आपके विनिर्देशन से सीधे क्वेरी लेखन:

  1. SELECT * FROM table WHERE bit_column_value IS NULL OR bit_column_value IS NOT TRUE
  2. SELECT * FROM table WHERE bit_column_value IS NULL OR bit_column_value = FALSE
  3. SELECT * FROM table WHERE bit_column_value IS NULL OR bit_column_value <> TRUE
  4. SELECT * FROM table WHERE bit_column_value IS NOT TRUE

ऊपर सच्चाई तालिका को देखते हुए, क्ष यूरी 4 आपको इच्छित परिणाम देगा - प्रमुख चेतावनी के साथ कि मैं निश्चित नहीं हूं कि एमएस एसक्यूएल सर्वर आईएस [NOT] {TRUE | FALSE | UNKNOWN} का समर्थन करता है। Predicates पर एमएसडीएन से निर्णय, IS [NOT] {TRUE | FALSE | UNKNOWN} भविष्यवाणी समर्थित नहीं है (लेकिन मैन्युअल के सही भाग को याद किया होगा)। यदि यह सही है, आप क्वेरी 2 में से एक या 3. उपयोग करने की आवश्यकता


(इन विधेय के साथ कुछ अतिरिक्त जटिलताओं रहे हैं जब मूल्य एक सरल स्तंभ नहीं है, लेकिन एक पंक्ति मूल्य है। हालांकि, यह प्रासंगिक नहीं है आपके प्रश्न या समस्या के लिए; दोगुना नहीं है क्योंकि एमएस एसक्यूएल सर्वर उन्हें समर्थन नहीं दे रहा है।)

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