2012-03-07 16 views
22

के साथ MySQL तुलना मेरे पास एक MySQL तालिका में CODE नामक कॉलम है जो पूर्ण हो सकता है। मान लें कि मेरे पास CODE = 'C' के साथ कुछ पंक्तियां हैं जिन्हें मैं अपने चयन परिणाम सेट में अनदेखा करना चाहता हूं। मैं अपने परिणाम सेट में या तो कोड = पूर्ण या कोड! = 'सी' हो सकता है।शून्य मूल्य

निम्न क्वेरी शून्य के रूप में कोड के साथ एक पंक्ति वापस नहीं करता है:

SELECT * from TABLE where CODE!='C' 

लेकिन इस क्वेरी के रूप में उम्मीद काम करता है और मैं जानता हूँ कि यह ऐसा करने का सही तरीका है।

SELECT * from TABLE where CODE IS NULL OR CODE!='C' 

मेरा प्रश्न है कि केवल कोड क्यों है! = 'सी' पंक्तियों को वापस नहीं करता है जहां CODE = NULL? निश्चित रूप से 'सी' पूर्ण नहीं है। हम यहां एक चरित्र के लिए कोई मूल्य की तुलना कर रहे हैं। क्या कोई कुछ प्रकाश डाल सकता है क्योंकि यह इस तरह से क्यों काम नहीं करता है?

+0

[MySQL रहस्य: संभव मूल्य गैर-शून्य स्ट्रिंग से अलग नहीं है] (http://stackoverflow.com/questions/3404766/mysql-mystery-null-value-is-not- अलग-from- गैर-नल-स्ट्रिंग) –

उत्तर

33

MySQL में, NULL को 'अनुपलब्ध, अज्ञात मान' के रूप में माना जाता है, जैसा कि कोई मूल्य नहीं है। at this MySQL Reference on NULL देखें।

NULL के साथ कोई भी गणित तुलना सही या गलत वापसी नहीं है, लेकिन NULL बजाय। लौटता है, तो, NULL != 'C' रिटर्न NULL, के रूप में सच लौटने के लिए विरोध किया।

'न्यूल' के साथ कोई अंकगणितीय तुलना झूठी वापसी होगी। एसक्यूएल में इस जांच करने के लिए:

SELECT IF(NULL=123,'true','false') 

NULL मूल्यों हम IS NULL & IS NOT NULL ऑपरेटर का उपयोग करने की जरूरत है की जाँच करें।

+4

सभी संबंधित डेटाबेस में, 'शून्य' अज्ञात गायब मान है। इसके बारे में mysql-विशिष्ट कुछ भी नहीं। –

+2

लेकिन कुछ स्थितियों में 'NULL'' FALSE' के बराबर है। तो यह डीबग करने के लिए परेशान हो सकता है और teh फिक्स अपेक्षाकृत लंबे समय तक और हैकिश लग सकता है। 'अद्यतन तालिका SET नाम = पर विचार करें? जहां आईडी = आईडी और नाम <>? ' आप स्पष्ट रूप से मतलब है, अद्यतन करें कि कोई अपडेट कुछ बदल जाएगा या नहीं। लेकिन अगर नाम शून्य है तो यह कभी भी पंक्ति को अपडेट नहीं करेगा।लापता डेटा का एक टुकड़ा कुछ वास्तविक मूल्य के बराबर नहीं है, इसलिए निश्चित रूप से इसे सही और काम करना चाहिए। शायद डीबी को 'नल लेकिन सत्य' मान प्रकार की आवश्यकता है, जैसे कि पर्ल '0 लेकिन सत्य 'के समान। – Jonathon

+1

@ जोनाथन विस्नोस्की नहीं, आपके उदाहरण ने 'न्यूल' की प्रकृति को नहीं बदला है। आपका उदाहरण एक ऐसा मामला प्रदान करता है जहां आप * 'NULL' का इलाज गैर-बराबर मान के समान करना चाहते हैं। उस स्थिति में, आप 'AND IFNULL (नाम, 'NOTMYVALUE') <>? 'का उपयोग कर सकते हैं - यह मेरी समझ है, वैसे भी। 'ISNULL' फ़ंक्शन एमएसएसक्यूएल में इस तरह से संचालित होता है, और मेरा मानना ​​है कि' IFNULL' समान रूप से काम करता है। –

11

एसक्यूएल में, नल मान एक विशेष मूल्य है, किसी अन्य के साथ तुलनीय नहीं है। कार्यान्वयन के आधार पर मूल्य के साथ प्रत्यक्ष तुलना का परिणाम हमेशा गलत या शून्य होता है।

एक शून्य मूल्य का परीक्षण करने के लिए आपको IS NULL और IS NOT NULL का उपयोग करना चाहिए।

+0

अक्सर टर्नरी लॉजिक के रूप में जाना जाता है। – sceaj

+0

किसी भी मूल्य के लिए 'NULL' की तुलना, यहां तक ​​कि खुद को हमेशा 'नल' (या कुछ कार्यान्वयन में 'अज्ञात') है लेकिन कभी भी 'गलत नहीं' है। आपने उस व्यवहार को कहाँ देखा है? –

+0

@ypercube, मैं पूरी तरह से आपसे सहमत हूं, लेकिन दुर्भाग्यवश ऐसे मामले मौजूद हैं। उदाहरण के लिए स्वीकृत उत्तर पर उदाहरण देखें: http://stackoverflow.com/questions/1843451/why-does-null-null-evaluate-to-false-in-sql- सर्वर। और "सत्य नहीं" – cornuz

5
SELECT * 
FROM `table_name` 
WHERE IFNULL(`column_name` != 'C', TRUE) 
22

मेरी परीक्षण और यहाँ प्रलेखन के आधार पर: http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html

आप अशक्त तुलना और < =>

उदाहरण के लिए का उपयोग कर एक बूलियन परिणाम प्राप्त कर सकते हैं:

select x <=> y; 
or 
select @x <=> @y; 

यह भी तुलना स्ट्रिंग बनाम नल, स्ट्रिंग बनाम स्ट्रिंग, आदि

+0

बहुत अच्छा समाधान! धन्यवाद – opio

2

* उपयोगकर्ता से चुनें जहां application_id = '1223333344' और नाम शून्य है;

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