MySQL: उन पंक्तियों का चयन करना जहाँ एक कॉलम अशक्त है


270

मुझे एक समस्या आ रही है जब मैं उन पंक्तियों का चयन करने की कोशिश करता हूं जिनमें एक निश्चित कॉलम के लिए NULL होता है, तो यह एक खाली सेट देता है। हालांकि, जब मैं phpMyAdmin में तालिका को देखता हूं, तो यह अधिकांश पंक्तियों के लिए अशक्त कहती है।

मेरी क्वेरी कुछ इस तरह दिखती है:

SELECT pid FROM planets WHERE userid = NULL

हर बार खाली सेट।

बहुत सारे स्थानों ने कहा कि यह सुनिश्चित करने के लिए है कि इसे वास्तविक मूल्य के बजाय "NULL" या "अशक्त" के रूप में संग्रहीत नहीं किया गया है, और एक ने केवल एक स्थान की तलाश करने की कोशिश करने के लिए कहा ( userid = ' ') लेकिन इनमें से किसी ने भी काम नहीं किया है। MyISAM का उपयोग नहीं करने और innoDB का उपयोग करने का सुझाव था क्योंकि MyISAM को अशक्त भंडारण में परेशानी होती है। मैंने टेबल को innoDB में बदल दिया, लेकिन अब मुझे लगता है कि समस्या यह हो सकती है कि यह वास्तव में अभी भी अशक्त नहीं है क्योंकि जिस तरह से यह इसे बदल रहा है। मैं इस तालिका को innoDB या कुछ और के रूप में फिर से बनाए बिना करना चाहता हूं, लेकिन अगर मुझे करना है, तो मैं निश्चित रूप से कोशिश कर सकता हूं।


1
MyISAM को अशक्त भंडारण में कोई परेशानी नहीं है। NULLs के शब्दार्थ को स्वयं इंजन से स्वतंत्र होना चाहिए।
मार्क

जवाबों:


512

SQL NULL का विशेष, और आपको करना होगा WHERE field IS NULL, क्योंकि NULL कुछ भी नहीं के बराबर हो सकता है,

स्वयं सहित (यानी: NULL = NULL हमेशा गलत है)।

Https://en.wikipedia.org/wiki/Codd%27s_12_rules देखेंRule 3


24
यह अज्ञात है - असत्य नहीं। एसक्यूएल तीन मूल्यवान तर्क का उपयोग करता है।
मार्टिन स्मिथ

38
NULL = NULL वास्तव में FALSE नहीं है - यह फिर से NULL है। लेकिन यह TRUE भी नहीं है, इसलिए IF (NULL = NULL) निष्पादित नहीं होगा।
कोनरक

1
यह भी देखें @obe उत्तर: SELECT 1 <=> 1, NULL <=> नल, 1 <=> NULL; -> 1, 1, 0
थॉमस

न केवल शून्य कुछ के बराबर नहीं है, यह किसी भी चीज के बराबर नहीं है, या तो नहीं है। दूसरे शब्दों में, उन पंक्तियों select * from foo where bar <> "abc"को नहीं लौटाएंगे जहाँ बार अशक्त है। कि आज मुझे एक पाश के लिए फेंक दिया। डॉक्स <>"ऑपरेटर के बराबर नहीं" को कॉल करता है, लेकिन वास्तव में यह "ऑपरेटर के अलावा कुछ और के बराबर है"।
स्टैकऑवरथ्रो


39

जैसा कि सभी उत्तर दिए गए हैं मैं थोड़ा और जोड़ना चाहता हूं। मैंने भी इसी मुद्दे का सामना किया था।

आपकी क्वेरी विफल क्यों हुई? आपके पास,

SELECT pid FROM planets WHERE userid = NULL;

यह आपको अपेक्षित परिणाम नहीं देगा, क्योंकि mysql डॉक्टर से

SQL में, NULL मान किसी भी अन्य मान की तुलना में कभी भी सत्य नहीं है, यहां तक ​​कि NULL भी। एक अभिव्यक्ति जिसमें NULL होता है, हमेशा एक NULL मान उत्पन्न करती है, जब तक कि अभिव्यक्ति में शामिल ऑपरेटरों और कार्यों के लिए प्रलेखन में संकेत नहीं दिया जाता है।

जोर मेरा।

स्तंभ मानों की खोज करने के लिए NULL, आप expr = NULLपरीक्षण का उपयोग नहीं कर सकते हैं । निम्नलिखित कथन में कोई पंक्तियाँ नहीं हैं, क्योंकि expr = NULLकिसी भी अभिव्यक्ति के लिए यह सच नहीं है

उपाय

SELECT pid FROM planets WHERE userid IS NULL; 

परीक्षण के लिए NULL, ऑपरेटरों IS NULLऔर IS NOT NULLऑपरेटरों का उपयोग करें ।


17

एक <=>ऑपरेटर भी है :

SELECT pid FROM planets WHERE userid <=> NULL

काम करेगा। अच्छी बात यह है कि <=>इसका उपयोग गैर-पूर्ण मूल्यों के साथ भी किया जा सकता है:

SELECT NULL <=> NULLपैदावार 1

SELECT 42 <=> 42पैदावार 1भी।

यहां देखें: https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_equal-to


11

Http://w3schools.com/sql/sql_null_values.asp से जानकारी :

1) पूर्ण मान लापता अज्ञात डेटा का प्रतिनिधित्व करते हैं।

2) डिफ़ॉल्ट रूप से, एक टेबल कॉलम NULL मान रख सकता है।

3) अन्य मूल्यों से पूर्ण मानों का अलग-अलग व्यवहार किया जाता है

4) NULL और 0 की तुलना करना संभव नहीं है; वे समकक्ष नहीं हैं।

5) तुलना ऑपरेटरों के साथ NULL मूल्यों के लिए परीक्षण करना संभव नहीं है, जैसे =, <, या <>।

6) हमें इसके बजाय IS NULL और IS NOT NULL ऑपरेटरों का उपयोग करना होगा

तो अपनी समस्या के मामले में:

SELECT pid FROM planets WHERE userid IS NULL

7

एक ही मुद्दा था जहाँ क्वेरी:

SELECT * FROM 'column' WHERE 'column' IS NULL; 

कोई मान नहीं लौटाया। MyISAM के साथ एक मुद्दा लगता है और InnoDB में डेटा पर एक ही क्वेरी अपेक्षित परिणाम लौटा।

साथ गया:

SELECT * FROM 'column' WHERE 'column' = ' '; 

सभी अपेक्षित परिणाम लौटाए।



0

मेरे पास एक ही मुद्दा था जब Access से MySQL तक डेटाबेस को परिवर्तित करना (डेटाबेस के साथ संवाद करने के लिए vb.net का उपयोग करना)।

यदि फ़ील्ड (फ़ील्ड प्रकार varchar (1)) शून्य था, तो मुझे यह आकलन करने की आवश्यकता है।

इस कथन ने मेरे परिदृश्य के लिए काम किया:

SELECT * FROM [table name] WHERE [field name] = ''

1
यदि वह आपके लिए काम करता है, तो आपके varchar (1) के लिए डिफ़ॉल्ट शून्य होने के बजाय '' है, इसलिए इस प्रश्न से संबंधित नहीं है।
さ げ な い '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.