2010-06-24 14 views
14

मैं एक MySQL क्वेरी कैसे चला सकता हूं जो शून्य नहीं है जो सब कुछ चुनता है? यहजहां सभी शून्य नहीं हैं

SELECT * FROM schedule WHERE ((all)) IS NOT NULL 

क्या मैं बस सभी को हटा दूंगा ..?

SELECT * FROM schedule WHERE IS NOT NULL 
+2

यदि आप उदाहरण डेटा जोड़ते हैं और आपके प्रश्न – Naktibalda

+1

पर अपेक्षित परिणाम जोड़ते हैं तो यह उपयोगी होगा यदि मुझे नहीं लगता कि इससे उत्तर में कोई फर्क पड़ता है। – Sam

+5

बेशक यह होगा ... आपने हमें जानकारी नहीं दी कि क्या शून्य नहीं होना चाहिए ... एक उदाहरण हमें दिखा सकता है कि आप किस चीज की उम्मीद कर रहे हैं! – Fred

उत्तर

18

आपको प्रत्येक कॉलम पर स्पष्ट रूप से स्थिति बताना होगा, उदाहरण के लिए

SELECT * 
FROM schedule 
WHERE id IS NOT NULL 
    AND foo IS NOT NULL 
    AND bar IS NOT NULL; -- and so on.. 
+0

पर छवि और स्वीकृत उत्तर देखें, इसलिए यह सब कुछ प्राप्त करना संभव नहीं है जहां यह शून्य नहीं है ...अरे नहीं। – Sam

+0

मेरा मानना ​​है कि एक रास्ता है, कृपया मेरा जवाब देखें। – Anax

+0

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

5

यह बिल्कुल "सब कुछ है कि अशक्त नहीं है" द्वारा तुम क्या मतलब है पर निर्भर करते हैं:

  • सभी स्तंभों null

    select * from schedule where col1 is not null AND col2 is not null AND ..

  • कम से कम एक स्तंभ नहीं होना चाहिए non-null

    होना चाहिए

    select * from schedule where col1 is not null OR col 2 is not null OR ..

कम से कम यह कैसे आप "सामान्य एसक्यूएल" में ऐसा होता है। मुझे नहीं पता कि MySQL के लिए इसके लिए विशेष वाक्यविन्यास है या नहीं।

SELECT * 
    FROM SCHEDULE 
WHERE ID || FOO || BAR IS NOT NULL; 
10

आप क्रम में केवल एक जहां शर्त लिखने के लिए क्षेत्रों को श्रेणीबद्ध कर सकते हैं नाम और एक पैरामीटर का उपयोग कर अशक्त नहीं तो जांच के बजाय उन सब में टाइप करने के लिए व्यक्तिगत रूप से जैसे

**code SQL** 

Select * 
FROM Schedule 
WHERE @ColumnName IS NOT NULL 

**code c#** 

for(int i =0; i<parameterArray[].length; i++) 
{ 
command.Parameters.Add(new SqlParameter("ColumnName", parameterArray[i])); 
command.Execute(); 
} 

मैं लेनदेन उपयोग करने का सुझाव है ताकि आप एक बैच में ऊपर कर सकते हैं के बाद पाश के लिए के माध्यम से समाप्त हो गया है जाएगा ।

+3

अपडेट नहीं कर सकते हैं तो यह एक अच्छा शॉर्टेंड है लेकिन सलाह दी जा सकती है; यह सभी डेटाबेस में जरूरी नहीं होगा। उदाहरण के लिए, पोस्टग्रेज़ के बाद के संस्करण केवल तभी स्वीकार करेंगे जब पहला कॉलम टेक्स्ट प्रकार का हो; जैसे वर्चर, चार या टेक्स्ट। मैं कुछ डेटाबेसों की कल्पना भी कर सकता हूं ताकि प्रत्येक कॉलम के लिए कास्ट की आवश्यकता हो जो कि इस प्रकार का नहीं है। – pyrocumulus

+3

यदि आपके पास लंबे टेक्स्ट फ़ील्ड हैं, तो कॉन्सटेनेशन एक महंगा ऑपरेशन है। इसके अलावा, परिणाम की लंबाई बहुत लंबी हो सकती है, एक त्रुटि बहती है। – Kobi

+2

यदि आपके पास लंबे टेक्स्ट फ़ील्ड हैं, तो आप इसका उपयोग कर सकते हैं: कहां आईडी || सबस्ट्र (फूड, 1,1) || SUBSTR (भोजन, 1,1) पूर्ण नहीं है; इस तरह, आप केवल हर लंबे टेक्स्ट फ़ील्ड के पहले अक्षर को निकालते हैं। – UltraCommit

0

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

3

आपको info_schema डेटाबेस को देखकर, अपनी तालिका के कॉलम की एक सूची प्राप्त करने की आवश्यकता है।

मान लीजिए कि आपके डेटाबेस को mydata कहा जाता है और प्रश्न में आपकी तालिका का नाम mytable है। आप निम्नलिखित बयान जारी करके तालिका के नल स्तंभों की सूची प्राप्त कर सकते हैं:

SELECT `COLUMN_NAME` 
FROM `information_schema`.`COLUMNS` 
WHERE `TABLE_SCHEMA` = 'mydata' 
    AND `TABLE_NAME` = 'mytable' 
    AND `IS_NULLABLE` = 'YES' 

हमारा अंतिम क्वेरी इस तरह दिखेगा:

SELECT * FROM `mydata`.`mytable` 
WHERE CONCAT(<list of columns>) IS NOT NULL 

सभी अब हम याद कर रहे हैं नल स्तंभों की सूची है, अल्पविराम से अलग।

SET @query = CONCAT(
    'SELECT * FROM `mydata`.`mytable` WHERE CONCAT(', 
    (SELECT GROUP_CONCAT(COLUMN_NAME) 
     FROM `information_schema`.`COLUMNS` 
     WHERE `TABLE_SCHEMA` = 'mydata' AND 
     `TABLE_NAME` = 'mytable' 
     AND `IS_NULLABLE` = 'YES'), 
    ') IS NOT NULL'); 

PREPARE stmt_name FROM @query; 

EXECUTE stmt_name; 

संदर्भ::

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html

3

मैं सिर्फ देखा है हम अंतिम बयान है, जो हम इस तरह निष्पादित करेंगे निर्माण करने के लिए GROUP_CONCAT समारोह का उपयोग करने के लिए जा रहे हैं अपने linked question पर और गुफ़ा के उत्तर से सहमत हैं कि आपको अपना डेटाबेस सामान्यीकृत करना चाहिए।

Linked Question Image

अधिक एक स्प्रेडशीट फिर कुछ ऐसा एक RDBMS में अंतर्गत आता है की तरह ऊपर दिखता है।

इस बारे में अपनी चिंताओं का उत्तर देने के लिए जिस तरह से आप इसे प्रदर्शित करना चाहते हैं। आप एक पिवट क्वेरी लिख सकते हैं और इसे अपनी वर्तमान तालिका संरचना की नकल करने के लिए एक दृश्य में डाल सकते हैं और इसे अपनी प्रदर्शन क्वेरी के लिए उपयोग कर सकते हैं।

जब भी आप डेटा खोजना चाहते हैं या यह पता लगाना है कि यह इस प्रश्न में नल है तो यह कुछ भयानक 24 कॉलम कहां खंड की आवश्यकता से बच जाएगा।

-2

मैं ऐसा नहीं होगा, लेकिन to replace someone else's horrible idea., विशेष रूप से ऐसा नहीं करते हैं - यह है कि वे क्या सुझाव दिया है:

SELECT * 
    FROM SCHEDULE 
WHERE ID || FOO || BAR IS NOT NULL; 

या तो ऐसा मत करो, लेकिन कम से कम यह रूप में नहीं है बुरा ...

SELECT * 
    FROM SCHEDULE 
WHERE coalesce(ID, FOO, BAR) IS NOT NULL; 

यह कम से कम एसक्यूएल के अन्य संस्करणों पर काम करता है, और कुछ compilers IS NOT NULL की एक श्रृंखला के लिए यह विस्तार होगा।

Just do what the accepted answer says

0

उपयोग एक्सएमएल आप अपने सभी कॉलम के माध्यम से पुनरावृति की जरूरत नहीं है तो:

--Your Source Table 
CREATE TABLE [dbo].[schedule](
    [id] [nchar](10) NULL, 
    [col1] [nchar](10) NULL, 
    [col2] [nchar](10) NULL, 
    [col3] [nchar](10) NULL 
) ON [PRIMARY] 

--I know my result should show items NOT NULL, like id:2,col1,val:'a' 
    INSERT INTO [schedule](id,col1,col2,col3) 
    values 
    (1,null,null,null), 
    (2,'a',null,null), 
    (3,null,'b',null), 
    (4,null,null,null), 
    (5,null,null,'c') 

--temp placeholder table 
CREATE TABLE #tempsch (id VARCHAR(max) not null, schColumns XML) 

--Load temp table with XML version of your table 
INSERT INTO #tempsch (id, schColumns) 
     SELECT s.id, 
      ( SELECT * 
       FROM [schedule] AS x 
       WHERE x.id = s.id 
       FOR XML PATH('bar'), TYPE, ROOT('foo') 
      ) AS xml_format_string 
     FROM [schedule] AS s 


--This select should return all values Where all is NOT NULL 
SELECT id, 
sd.c.value('local-name(.)', 'VARCHAR(MAX)') AS elementName, 
sd.c.value('.', 'VARCHAR(MAX)') AS elementValue 
FROM #tempsch s 
CROSS APPLY schColumns.nodes('/foo/bar/*') sd(c) 
WHERE 
sd.c.value('local-name(.)', 'VARCHAR(MAX)') <> 'id' 
0

यह केवल चार और varchar प्रकार के साथ काम करता है। यदि आपके पास अन्य डेटाटाइप हैं तो यह त्रुटि फेंकता है।

SELECT * 
    FROM SCHEDULE 
WHERE coa 

lesce(ID, FOO, BAR) IS NOT NULL; 

असंगत डेटाटाइप्स: उम्मीद CHAR मिला DATE नोट: यहाँ FOO तारीख प्रकार का है।

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