नोट: चूँकि किसी ने दावा किया कि बाहरी लिंक सुशांत बुट्टा के उत्तर में मृत है, इसलिए मैंने एक अलग उत्तर के रूप में सामग्री यहाँ पोस्ट की है।
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_b
IN
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_b
NOT 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
।
नल से सावधान !!
in
बयान को पहचान के लिए पार्स किया जाएगाfield=val1 or field=val2 or field=val3
। वहाँ एक अशक्त डाल करने के लिए नीचे उबालfield=null
होगा जो काम नहीं करेगा।