MySQL सेलेक्ट करें न केवल शून्य मान


264

क्या ऐसा चयन कथन करना संभव है जो न केवल NULL मान लेता हो?

अभी मैं इसका उपयोग कर रहा हूं:

SELECT * FROM table

और फिर मुझे php लूप के साथ अशक्त मानों को फ़िल्टर करना होगा।

क्या कोई तरीका है:

SELECT * (that are NOT NULL) FROM table

?

अभी जब मैं * सेलेक्ट करता हूं तो मुझे val1, val2, val3, null, val4, val5, null, null इत्यादि मिलते हैं .... लेकिन मैं केवल उन मूल्यों को प्राप्त करना चाहता हूं जो मेरे परिणाम में शून्य नहीं हैं। क्या यह एक लूप के साथ फ़िल्टर किए बिना संभव है?


2
यदि ऐसी कोई पंक्ति है जहां कुछ स्तंभों में NULL मान हैं और अन्य स्तंभों में NULL मान नहीं हैं, तो आप क्या करना चाहते हैं?
मार्क बायर्स

मैं केवल उन स्तंभों से मान प्राप्त करना चाहूँगा जो शून्य नहीं हैं, और पंक्ति में केवल स्तंभ मान लौटाएँ जो शून्य नहीं हैं। अभी मैं उन्हें छानने के लिए एक लूप का उपयोग करता हूं, क्या यह लूप के बिना करना संभव है?
ब्रायन सेमन

1
@ ब्रायन - आपकी टेबल संरचना क्या है? क्या सभी स्तंभों में समान डेटाटाइप है?
मार्टिन स्मिथ

1
@ ब्रायन - तो आपका आदर्श परिणाम सेट कैसा दिखेगा? एक कॉलम परिणाम, जिसमें सभी गैर अशक्त मान हैं? उदाहरण डेटा और वांछित परिणामों के साथ अपने प्रश्न को संपादित नहीं करने पर मदद मिलेगी ...
मार्टिन स्मिथ

2
@ ब्रायन - ऐसा लगता है कि आपकी तालिका में कॉलमों में दोहराए जाने वाले समूह हो सकते हैं? (स्पष्टीकरण के लिए विकी लेख देखें और सुझाव दिया गया वैकल्पिक ढांचा अगर ऐसा ही हो। enikw.org.org/wiki/First_normal_form )
मार्टिन स्मिथ

जवाबों:


452

आपको उपयोग करना चाहिए IS NOT NULL। (तुलना ऑपरेटरों =और <>दोनों दे UNKNOWNके साथ NULLअभिव्यक्ति के दोनों तरफ।)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

पूर्णता के लिए मैं उल्लेख करूंगा कि MySQL में आप अशक्त सुरक्षित समानता ऑपरेटर को भी नकार सकते हैं लेकिन यह मानक SQL नहीं है।

SELECT *
FROM table 
WHERE NOT (YourColumn <=> NULL);

टिप्पणियों को प्रतिबिंबित करने के लिए संपादित। ऐसा लगता है कि आपकी तालिका पहले सामान्य रूप में नहीं हो सकती है जिसमें संरचना को बदलने से आपका कार्य आसान हो सकता है। हालांकि इसे करने के अन्य तरीकों की एक जोड़ी ...

SELECT val1 AS val
FROM  your_table
WHERE val1 IS NOT NULL
UNION ALL
SELECT val2 
FROM  your_table
WHERE val2 IS NOT NULL
/*And so on for all your columns*/

उपरोक्त का नुकसान यह है कि यह प्रत्येक स्तंभ के लिए एक बार तालिका को कई बार स्कैन करता है। संभवतः नीचे से बचा जा सकता है लेकिन मैंने MySQL में इसका परीक्षण नहीं किया है।

SELECT CASE idx
         WHEN 1 THEN val1
         WHEN 2 THEN val2
       END AS val
FROM   your_table
        /*CROSS JOIN*/
       JOIN (SELECT 1 AS idx
                   UNION ALL
                   SELECT 2) t
HAVING val IS NOT NULL  /*Can reference alias in Having in MySQL*/

2
बहुत बहुत धन्यवाद .. यह मदद मिली :)
DfrDkn

अंतिम दृष्टिकोण में, आपने CASEस्टेटमेंट का उपयोग किया, CASEफ़ंक्शन का नहीं । तो क्या END CASEइसके बजाय भाग END में नहीं होना चाहिए SELECT CASE ...?
इस्तियाक अहमद

नहीं-विशेषज्ञ लोगों के लिए, क्या आप अंतिम समाधान बता सकते हैं? क्या idx रोम पहले SELECTसे idxदूसरे में आता है SELECT? CASEकथन क्या पूरा करने की कोशिश करता है? दूसरा SELECTवास्तव में क्या करता है? और आप एक आंतरिक जुड़ाव कर रहे हैं, एक क्रॉस जॉइन नहीं, है ना?
इस्तियाक अहमद

मुझे नहीं लगता कि यह सवाल का जवाब देता है। ऐसा लग रहा था कि ओपी चयन करना चाहता था (मैं एक विशिष्ट) पंक्ति का चयन करता हूं, लेकिन उस परिणाम के सभी स्तंभों को बाहर कर देता हूं जो अशक्त थे - इस उत्तर के लिए आपको यह निर्दिष्ट करने की आवश्यकता है कि कौन से कॉलम अशक्त होने की अनुमति नहीं है (जो पूरी तरह से एक अलग समस्या है) या सभी स्तंभों को निर्दिष्ट करें, कई स्तंभों के साथ तालिकाओं के लिए अनुपयुक्त
csey

(जैसे कुछ की तर्ज पर SELECT * FROM table WHERE * IS NOT NULL AND primary_key="somevalue")
csey

18

आप उन पंक्तियों को फ़िल्टर कर सकते हैं जिनमें एक विशिष्ट कॉलम में NULL मान होता है:

SELECT col1, col2, ..., coln
FROM yourtable
WHERE somecolumn IS NOT NULL

यदि आप उन पंक्तियों को फ़िल्टर करना चाहते हैं जिनमें किसी भी कॉलम में एक अशक्त है तो यह प्रयास करें:

SELECT col1, col2, ..., coln
FROM yourtable
WHERE col1 IS NOT NULL
AND col2 IS NOT NULL
-- ...
AND coln IS NOT NULL

अपडेट: आपकी टिप्पणियों के आधार पर, शायद आप यह चाहते हैं?

SELECT * FROM
(
    SELECT col1 AS col FROM yourtable
    UNION
    SELECT col2 AS col FROM yourtable
    UNION
    -- ...
    UNION
    SELECT coln AS col FROM yourtable
) T1
WHERE col IS NOT NULL

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


मुझे यकीन नहीं है कि अगर मैंने इसे अच्छी तरह से समझाया, लेकिन im थोड़ा बेहतर प्रयास करने वाला हूं। अभी जब मैं * सेलेक्ट करता हूं तो मुझे val1, val2, val3, null, val4, val5, null, null इत्यादि मिलते हैं .... लेकिन मैं केवल उन मूल्यों को प्राप्त करना चाहता हूं जो मेरे परिणाम में शून्य नहीं हैं। क्या यह एक लूप के साथ फ़िल्टर किए बिना संभव है?
ब्रायन सैमसन

@ ब्रायन - क्या आप बता सकते हैं कि कॉलम क्या *देता है? हो सकता है कि आपके प्रश्न में कुछ उदाहरण डेटा प्रदान करें क्योंकि यह आपकी टिप्पणी से ऊपर स्पष्ट नहीं है कि क्या यह सभी एक कॉलम है।
मार्टिन स्मिथ

अभी, * पंक्ति में मेरे सभी मान लौटाता है। यानि val1, val2, val3, null, val4, val5, null, null लेकिन मैं चाहता हूं कि यह केवल उन स्तंभ मानों को लौटाए जो अशक्त नहीं हैं। अभी मैं इसे परिणाम वापस करने के बाद मूल्यों को फ़िल्टर करने के लिए एक लूप के साथ करता हूं।
बायरन सैमसन

13
Select * from your_table 
WHERE col1 and col2 and col3 and col4 and col5 IS NOT NULL;

इस दृष्टिकोण का एकमात्र नुकसान यह है कि आप केवल 5 कॉलमों की तुलना कर सकते हैं, उसके बाद परिणाम हमेशा गलत होगा, इसलिए मैं केवल उन क्षेत्रों की तुलना करता हूं जो हो सकते हैं NULL


8

मुझे यह समाधान मिला:

यह क्वेरी प्रत्येक कॉलम के लिए अंतिम नहीं शून्य मान का चयन करती है।

उदाहरण


यदि आपके पास एक मेज है:

id|title|body
1 |t1   |b1
2 |NULL |b2
3 |t3   |NULL

आपको मिला:

title|body
t3   |b2

सवाल


SELECT DISTINCT (

  SELECT title
  FROM test
  WHERE title IS NOT NULL 
  ORDER BY id DESC 
  LIMIT 1
) title, (

  SELECT body
  FROM test
  WHERE body IS NOT NULL 
  ORDER BY id DESC 
  LIMIT 1
) body
FROM test

मुझे आशा है कि आप मदद करेंगे।


GROUP_CONCAT (बॉडी) AS बॉडी
रवींद्र सिंह

2

मैं \!खोल से NULL मान निकालने के लिए MySQL के भीतर कमांड का उपयोग करता हूं :

\! mysql -e "SELECT * FROM table WHERE column = 123456\G" | grep -v NULL

यह एक उचित के साथ सबसे अच्छा काम करता है .my.cnfजहां आपका डेटाबेस / उपयोगकर्ता नाम / पासवर्ड निर्दिष्ट किया जाता है। इस तरह आप बस अपने चारों ओर करने के लिए है selectके साथ \! mysql eऔर | grep -v NULL


1

मेरे लिए काम करने के बाद क्वेरी

जब मैंने 'NULL' कॉलम का डिफ़ॉल्ट मान सेट किया है

select * from table where column IS NOT NULL

और जब मैंने डिफ़ॉल्ट मान सेट किया है तब कुछ भी नहीं

select * from table where column <>''


0

MYSQL जॉइन और चयन के साथ पूर्ण नहीं है, INSERT INTO, DELETE और लॉजिकल ऑपेरटर की तरह नहीं है, नहीं

Using IS NOT NULL On Join Conditions

 SELECT * FROM users 
 LEFT JOIN posts ON post.user_id = users.id 
 WHERE user_id IS NOT NULL;

 Using IS NOT NULL With AND Logical Operator

 SELECT * FROM users 
 WHERE email_address IS NOT NULL 
 AND mobile_number IS NOT NULL;

Using IS NOT NULL With OR Logical Operator

 SELECT * FROM users 
 WHERE email_address IS NOT NULL 
 OR mobile_number IS NOT NULL;

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.