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