NULL या IS NULL के साथ क्लॉज में


84

Postgres डेटाबेस है

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

SELECT *
FROM tbl_name
WHERE id_field IN ('value1', 'value2', 'value3', NULL)

मैं इन चार मूल्यों को सीमित करना चाहता हूं।

मैंने उपरोक्त कथन की कोशिश की है और यह काम नहीं करता है, अच्छी तरह से यह निष्पादित करता है लेकिन NULL id_fields के साथ रिकॉर्ड नहीं जोड़ता है।

मैंने भी एक शर्त जोड़ने की कोशिश की है, लेकिन यह केवल क्वेरी को चलाने और दृष्टि में कोई अंत नहीं है।

SELECT *
FROM tbl_name
WHERE other_condition = bar
AND another_condition = foo
AND id_field IN ('value1', 'value2', 'value3')
OR id_field IS NULL

कोई सुझाव?


10
एक inबयान को पहचान के लिए पार्स किया जाएगा field=val1 or field=val2 or field=val3। वहाँ एक अशक्त डाल करने के लिए नीचे उबाल field=nullहोगा जो काम नहीं करेगा।
मार्क बी

1
दूसरी क्वेरी सही होनी चाहिए। आपके whereक्लाज में और क्या चीजें हैं ?
डैनियल ए। व्हाइट

@ डैनियल ए। व्हाइट, क्वेरी को और अधिक स्थितियों के साथ प्रतिबिंबित करने के लिए अपडेट किया गया
18-40 पर फिल पफर्ड

जवाबों:


124

एक inबयान को पहचान के लिए पार्स किया जाएगा field=val1 or field=val2 or field=val3। वहाँ एक अशक्त डाल करने के लिए नीचे उबाल field=nullहोगा जो काम नहीं करेगा।

( मार्क बी द्वारा टिप्पणी )

मैं क्लैरिटी के लिए ऐसा करूंगा

SELECT *
FROM tbl_name
WHERE 
(id_field IN ('value1', 'value2', 'value3') OR id_field IS NULL)

आह कि यह किया, धन्यवाद! तो खेतों को लपेटना दोनों शर्तों को जोड़ता है कि कहां है? सिर्फ स्पष्टीकरण के लिए
फिल पफर्ड

1
@ वायल - यह ऑपरेशन की समस्या का एक आदेश था।
डैनियल ए। व्हाइट

20

ऑपरेटर वरीयता के कारण आपकी क्वेरी विफल हो जाती हैANDपहले बांधता है OR!
आपको कोष्ठकों की एक जोड़ी की आवश्यकता है, जो "स्पष्टता" का मामला नहीं है, लेकिन शुद्ध तर्क की आवश्यकता है

SELECT *
FROM   tbl_name
WHERE  other_condition = bar
AND    another_condition = foo
AND   (id_field IN ('value1', 'value2', 'value3') OR id_field IS NULL)

जोड़ा गया कोष्ठक ANDपहले बंधन को रोकता है OR। यदि अन्य WHEREशर्तें नहीं थीं (नहीं AND) तो आपको कोष्ठक की आवश्यकता नहीं होगी । स्वीकृत उत्तर इस संबंध में थोड़ा भ्रामक है।


15
SELECT *
FROM tbl_name
WHERE coalesce(id_field,'unik_null_value') 
IN ('value1', 'value2', 'value3', 'unik_null_value')

ताकि आप चेक से नल को खत्म कर दें। Id_field में एक अशक्त मान को देखते हुए, coalesce फ़ंक्शन null रिटर्न 'unik_null_value' के बजाय, और 'unik_null_value को IN-list में जोड़कर, क्वेरी पोस्ट को लौटा देगा क्योंकि id_field value1-3 या null है।


2
थोड़ी सी व्याख्या भविष्य के पाठकों के लिए उपयोगी होगी। आपका कोड समस्या को हल करने में कैसे मदद करता है?
शोदेव

9

डैनियल ने जिस सवाल का जवाब दिया वह बिल्कुल ठीक है। मैं NULLS के संबंध में एक नोट छोड़ना चाहता था। जब एक कॉलम में NULL मान होते हैं, तो हमें NOT IN ऑपरेटर का उपयोग करने में सावधानी बरतनी चाहिए। यदि आपके कॉलम में NULL मान हैं तो आपको कोई आउटपुट नहीं मिलेगा और आप NOT IN ऑपरेटर का उपयोग कर रहे हैं। इस तरह से इसे यहाँ समझाया गया है http://www.oraclebin.com/2013/01/beware-of-nulls.html , एक बहुत अच्छा लेख, जो मुझे आया था और इसे साझा करने के बारे में सोचा।


यकीन नहीं है कि कितने उपयोग ने इस समस्या का अनुभव किया है, लेकिन मेरे पास यह सटीक मुद्दा था नल और नॉट ऑपरेटर को मिलाकर और पिछले दो घंटे से इस पर हाथ धोना था। यह पर्क है ...
गोविंद राय

1
लिंक मर चुका है।
डेग होरिदहल

1
जैसे अभी जिंदा है।
हमेशा-सीखने वाला

3

नोट: चूँकि किसी ने दावा किया कि बाहरी लिंक सुशांत बुट्टा के उत्तर में मृत है, इसलिए मैंने एक अलग उत्तर के रूप में सामग्री यहाँ पोस्ट की है।

NULLS से सावधान रहें ।

आज मैं IN और NOT INऑपरेटरों का उपयोग करते हुए क्वेरी के एक बहुत ही अजीब व्यवहार में आया था । वास्तव में मैं दो तालिकाओं की तुलना करना चाहता था और यह जानना चाहता था कि क्या स्तंभ में मान table bमौजूद है table aया नहीं और यदि स्तंभ में nullमान हैं तो उसका व्यवहार ज्ञात करें। इसलिए मैंने इस व्यवहार का परीक्षण करने के लिए सिर्फ एक वातावरण बनाया।

हम टेबल बनाएंगे table_a

SQL> create table table_a ( a number);
Table created.

हम टेबल बनाएंगे table_b

SQL> create table table_b ( b number);
Table created.

कुछ मान डालें table_a

SQL> insert into table_a values (1);
1 row created.

SQL> insert into table_a values (2);
1 row created.

SQL> insert into table_a values (3);
1 row created.

कुछ मान डालें table_b

SQL> insert into table_b values(4);
1 row created.

SQL> insert into table_b values(3);
1 row created.

अब हम ऑपरेटर का उपयोग table_aकरके इसके मूल्य की जांच करके एक मूल्य के अस्तित्व की जांच करने के लिए एक क्वेरी निष्पादित करेंगे ।table_bIN

SQL> select * from table_a where a in (select * from table_b);
         A
----------
         3

गैर अस्तित्व की जांच करने के लिए क्वेरी के नीचे निष्पादित करें।

SQL> select * from table_a where a not in (select * from table_b);
         A
----------
         1
         2

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

SQL> insert into table_b values(null);
1 row created.

SQL> select * from table_a where a in (select * from table_b);
         A
----------
         3

SQL> select * from table_a where a not in (select * from table_b);

no rows selected

पहली क्वेरी के अनुसार अपेक्षित व्यवहार किया गया लेकिन दूसरी क्वेरी का क्या हुआ? हमें कोई आउटपुट क्यों नहीं मिला, क्या होना चाहिए था? क्या क्वेरी में कोई अंतर है? नहीं

परिवर्तन तालिका के डेटा में है table_b। हमने nullतालिका में एक मूल्य पेश किया है। लेकिन यह इस तरह से कैसे व्यवहार कर रहा है? आइए दो प्रश्नों को आपरेटर "AND"और "OR"ऑपरेटर में विभाजित करें ।

पहला प्रश्न:

पहली क्वेरी को आंतरिक रूप से कुछ इस तरह से संभाला जाएगा। तो एक nullसमस्या यहाँ पैदा नहीं होगी क्योंकि मेरे पहले दो ऑपरेंड या तो मूल्यांकन करेंगे trueया false। लेकिन मेरा तीसरा संचालक a = nullन तो मूल्यांकन करेगा और न trueही false। यह nullकेवल मूल्यांकन करेगा ।

select * from table_a whara a = 3 or a = 4 or a = null;

a = 3  is either true or false
a = 4  is either true or false
a = null is null

दूसरी क्वेरी:

दूसरी क्वेरी नीचे दी जाएगी। चूंकि हम एक "AND"ऑपरेटर का उपयोग कर रहे हैं और trueकिसी भी ऑपरेंड के अलावा कुछ भी मुझे कोई आउटपुट नहीं देगा।

select * from table_a whara a <> 3 and a <> 4 and a <> null;

a <> 3 is either true or false
a <> 4 is either true or false
a <> null is null

तो हम इसे कैसे संभालते हैं? हम ऑपरेटर का उपयोग करते समय not nullतालिका से सभी मान लेंगे ।table_bNOT IN

SQL> select * from table_a where a not in (select * from table_b where b is not null);

         A
----------
         1
         2

इसलिए ऑपरेटर NULLका उपयोग करते समय हमेशा कॉलम में मूल्यों के बारे में सावधान रहें NOT IN

नल से सावधान !!


बहुत बढ़िया जवाब। मैंने सिर्फ अपने काम में समस्या का पता लगाया है। ओरेकल का बहुत अजीब व्यवहार।
14 अक्टूबर को oputyk

0

मुझे पता है कि जवाब देने के लिए देर हो चुकी है लेकिन किसी और के लिए उपयोगी हो सकता है आप उप-क्वेरी का उपयोग कर सकते हैं और शून्य को 0 में बदल सकते हैं

SELECT *
FROM (SELECT CASE WHEN id_field IS NULL 
                THEN 0 
                ELSE id_field 
            END AS id_field
      FROM tbl_name) AS tbl
WHERE tbl.id_field IN ('value1', 'value2', 'value3', 0)

यह ओले हलेसेथ के उत्तर के समान है, जो मोटे तौर पर उपयोग करता है।
user890332

0

Nullडेटा की अनुपस्थिति को संदर्भित करता है। Nullऔपचारिक रूप से एक ऐसे मान के रूप में परिभाषित किया गया है जो अनुपलब्ध, अप्रमाणित, अज्ञात या अनुपयुक्त (OCA Oracle डेटाबेस 12c, SQL फंडामेंटल I परीक्षा गाइड, p87) है। इसलिए, आप उन कॉलमों के रिकॉर्ड नहीं देख सकते हैं जिनमें शून्य मान हैं, जब कहा जाता है कि कॉलम "इन" या "क्लॉस" का उपयोग करके प्रतिबंधित है।

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