यह उत्तर थोड़ा अटपटा लग सकता है...
Oracle बहुत है सेट संचालन के साथ picky। प्रत्येक कॉलम में वही डेटा-प्रकार होना चाहिए जो दूसरे, तीसरे आदि प्रश्नों में संबंधित है।
मैं सोचता हूं आपकी दूसरी क्वेरी विफल हो जाती है क्योंकि Oracle to_number()
. का मूल्यांकन करता है एक संख्या के रूप में पहले संघ
करने के लिए लेकिन "null-ness" बाद . के लिए इसका मूल्यांकन करता है . आपकी पहली क्वेरी सफल होती है क्योंकि पहले मान का मूल्यांकन "नल-नेस" और फिर संघ
के लिए किया गया है घटित होना। इसका तात्पर्य यह है कि मूल्यांकन का क्रम है:
- पहला चुनिंदा फंक्शन
- पहला चुनिंदा डेटा-प्रकार
- दूसरा चुनिंदा कार्य
- संघ
- दूसरा चुनिंदा डेटा-प्रकार
मैं इसे चरण-दर-चरण साबित करने का प्रयास करूंगा लेकिन मुझे यकीन नहीं है कि यह एक पूर्ण प्रमाण होगा।
निम्नलिखित दोनों प्रश्न
select 1 from dual union select '1' from dual;
select '1' from dual union select 1 from dual;
निम्न त्रुटि के साथ विफल हो जाएगा क्योंकि कोई अंतर्निहित रूपांतरण नहीं होता है।
हालांकि, निम्नलिखित दोनों सफल होंगे
select null from dual union select '1' from dual;
select null from dual union select 1 from dual;
अगर हम डंप
इन दो प्रश्नों में से निम्नलिखित वापस हो जाते हैं:
SQL> select dump(a)
2 from ( select null a from dual union select '1' from dual );
DUMP(A)
-------------------------------------------------------------------
Typ=96 Len=1: 49
NULL
SQL> select dump(a)
2 from ( select null a from dual union select 1 from dual );
DUMP(A)
-------------------------------------------------------------------
Typ=2 Len=2: 193,2
NULL
जैसा कि आप देख सकते हैं कि कॉलम में अलग-अलग डेटा-प्रकार हैं
. पहली क्वेरी, एक वर्ण के साथ, एक char
लौटाती है और दूसरा एक नंबर देता है, लेकिन दूसरा चुनें
. के साथ ऑर्डर बदल दिया गया है पहले आ रहा है।
अंत में, अगर हम डंप
देखें आपकी पहली क्वेरी के बारे में
SQL> select substr(dump(ename),1,35) a, substr(dump(loc),1,35) b
2 from ( select ename,to_number(null) as loc from emp
3 union
4 select to_char(null),loc from dept
5 );
A B
----------------------------------- -----------------------------------
Typ=1 Len=6: 104,97,104,97,104,97 NULL
NULL Typ=1 Len=6: 104,97,104,97,104,97
SQL>
आप देख सकते हैं कि dump(to_number(null))
शून्य है; लेकिन एक varchar2
char
नहीं लौटाया जा रहा है, क्योंकि यह आपके कॉलम का डेटा-प्रकार है। यह ध्यान रखना दिलचस्प है कि लौटाए गए बयानों का क्रम उलट नहीं किया गया है और यदि आप इस क्वेरी को एक तालिका के रूप में बनाना चाहते हैं तो दोनों कॉलम varchar2
होंगे ।
किसी चयनित क्वेरी में कॉलम के डेटा-प्रकार का निर्णय करते समय Oracle पहले ज्ञात डेटा-प्रकार को लेता है और फिर समग्र डेटा-प्रकार की गणना करने के लिए इसका उपयोग करता है। यही कारण है कि वे प्रश्न जहां पहले चयन करें
उनकी पंक्तियों को उलट दिया गया था।
आपकी पहली क्वेरी सफल होती है क्योंकि पहला चयन, ename,to_number(null) from emp
चुनें , "बताता है" कि परिणाम सेट कैसा दिखने वाला है। |varchar2|null|
. दूसरी क्वेरी तब जोड़ती है, |varchar2|varchar2|
, जिससे कोई समस्या नहीं होती है।
आपकी दूसरी क्वेरी विफल हो जाती है क्योंकि पहला ename,to_number(null) from emp
चुनें। varchar2, null
. के रूप में सेट किए गए परिणाम का "वर्णन" करता है . हालांकि, फिर आप संघ
. में एक शून्य संख्या और एक varchar2 जोड़ने का प्रयास करते हैं ।
यहाँ विश्वास की छलांग यह है कि Oracle यह तय कर रहा है कि to_number(null)
पहले एक संख्या है संघ
. के लिए और इसके बाद तक "शून्य-नेस" के लिए इसका मूल्यांकन नहीं कर रहा है। मैं वास्तव में नहीं जानता कि यह कैसे परीक्षण किया जाए कि क्या यह वास्तव में हो रहा है क्योंकि आप null
के साथ कोई ऑब्जेक्ट नहीं बना सकते हैं कॉलम और जैसा कि आप ध्यान दें, आप इसे भी नहीं चुन सकते हैं।
जैसा कि मैं कुछ ऐसा साबित नहीं कर सकता जिसे Oracle अस्वीकार करता है, मैं अनुभवजन्य साक्ष्य के लिए प्रयास करूँगा। निम्नलिखित प्रश्नों के परिणामों (या त्रुटियों) पर विचार करें।
SQL> select 1 as a from dual union select to_number(null) from dual;
A
----------
1
SQL> select '1' as a from dual union select to_number(null) from dual;
select '1' as a from dual union select to_number(null) from dual
*
ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression
SQL> select 1 as a from dual union select to_char(null) from dual;
select 1 as a from dual union select to_char(null) from dual
*
ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression
SQL> select '1' as a from dual union select to_char(null) from dual;
A
-
1
वे प्रदर्शित करते हैं कि to_char
और to_number
, कोई फर्क नहीं पड़ता कि वे एक शून्य पर प्रदर्शन कर रहे हैं या नहीं, एक डेटा-प्रकार को परिभाषित करते हैं जिसका मूल्यांकन संघ
में इसकी उपयुक्तता के लिए किया जाता है। , "null-ness" के लिए उनके मूल्यांकन से पहले
इस स्पष्टीकरण में सम्मिलित
. भी शामिल होगा to_number(null)
. के रूप में जारी करें पहले . एक संख्या है यह एक शून्य है।