शामिल होने की खातिर एक अशक्त एक शून्य के बराबर क्यों नहीं हो सकता है?
ओरेकल को ऐसा करने के लिए कहें:
select *
from one t1
join two t2 on coalesce(t1.id, -1) = coalesce(t2.id, -1);
(ध्यान दें कि मानक एसक्यूएल में आप t1.id is not distinct from t2.id
अशक्त-सुरक्षित समानता ऑपरेटर प्राप्त करने के लिए उपयोग कर सकते हैं , लेकिन ओरेकल इसका समर्थन नहीं करता है)
लेकिन यह केवल तभी काम करेगा जब प्रतिस्थापन मूल्य (उपरोक्त उदाहरण में -1) वास्तव में तालिका में दिखाई नहीं देता है। संख्याओं के लिए इस तरह के "जादू" मूल्य को खोजना संभव हो सकता है, लेकिन यह चरित्र मूल्यों के लिए बहुत मुश्किल होगा (विशेषकर क्योंकि ओरेकल एक खाली स्ट्रिंग के साथ- null
साथ व्यवहार करता है )
प्लस: id
स्तंभों पर कोई भी इंडेक्स उपयोग नहीं किया जाएगा (आप एक फ़ंक्शन आधारित इंडेक्स को हालांकि अभिव्यक्ति के साथ परिभाषित कर सकते हैं coalesce()
)।
एक अन्य विकल्प जो सभी प्रकारों के लिए काम करता है, बिना जादुई मूल्यों के:
on t1.id = t2.id or (t1.id is null and t2.id is null)
लेकिन असली सवाल यह है: क्या यह समझ में आता है?
निम्नलिखित नमूना डेटा पर विचार करें:
तालिका एक
id
----
1
2
(null)
(null)
तालिका दो
id
----
1
2
(null)
(null)
(null)
नल मूल्यों में से कौन सा संयोजन में चुना जाना चाहिए? मेरे उपरोक्त उदाहरण के परिणामस्वरूप सभी शून्य मानों के लिए एक क्रॉस जॉइन होगा।
T1_ID | T2_ID
-------+-------
1 | 1
2 | 2
(null) | (null)
(null) | (null)
(null) | (null)
(null) | (null)
(null) | (null)
(null) | (null)
where (a = b or (a is null and b is null))
sys_op_map_nonnull