वहाँ वास्तव में तीन प्रश्न हैं जिनका मैं उत्तर देने का प्रयास करूँगा।
-
unknown. का उद्देश्य क्या है? ?यह डेटा प्रकार शुरू में एनयूएलएल और एसक्यूएल स्टेटमेंट में स्ट्रिंग अक्षर को सौंपा गया है। यदि ऐसे शाब्दिकों को टाइप किया गया था
textतुरंत, सही प्रकार का अनुमान लगाना कठिन होगा।उदाहरण के लिए, आप
myfunc('hello'). चाहते हैंmyfunc(character varying)का आह्वान करने के लिए , लेकिनtext. से कोई अंतर्निहित प्रकार नहीं डाला गया है सेcharacter varying(और अगर आपने इसे बनाया है तो यह अस्पष्टता पैदा करेगा)। -
क्यों
SELECT nullunknown. प्रकार का कॉलम लौटाएं ?पारंपरिक उत्तर है:क्योंकि उपयोगकर्ता ने प्रकार निर्दिष्ट नहीं किया था।
हालाँकि, यह व्यवहार समस्याग्रस्त रहा है। उदाहरण के लिए, यदि आप इस तरह की तालिका बनाते हैं:
CREATE TABLE test AS SELECT 'hello';आप
unknown. प्रकार के कॉलम के साथ समाप्त होंगे , जो अवांछित है और आगे भी समस्याएं पैदा करेगा। प्रकारunknownवास्तव में उपयोगकर्ता दृश्यमान नहीं होना चाहिए, बल्कि एक कार्यान्वयन विवरण होना चाहिए।नतीजतन, यह कमिट PostgreSQL v10 से व्यवहार को बदल दिया है:अब कोई भी
unknownSELECT. में छोड़ दिया गया है याRETURNINGसूची कोtextके लिए बाध्य किया जाता है , और तालिकाएंunknown. प्रकार के स्तंभों के साथ नहीं बनाई जा सकतीं । -
SELECT NULL UNION SELECT 42काम करते हैं, लेकिन नहींSELECT NULL UNION SELECT NULL UNION SELECT 42?यह टाइप कन्वर्ज़न नियम के कारण देय है .
UNIONसाहचर्य छोड़ दिया गया है, इसलिए बाद की क्वेरी की व्याख्या इस प्रकार की जाती है(SELECT NULL UNION SELECT NULL) UNION SELECT 42;अब पहला
UNIONडेटा प्रकारtext. का समाधान करता है नियम 3 के कारण:दूसरे
UNION. के प्रकार को हल करने का प्रयास करते समय यह त्रुटि उत्पन्न करता है नियम 4 के कारण:दूसरी ओर, क्वेरी में
SELECT NULL UNION SELECT 42;“NULL” का प्रकार
unknownहै , और “42” का प्रकारinteger. है (दशमलव बिंदु के बिना संख्यात्मक शाब्दिक के लिए चुना गया प्रकार)।नियम 5
यहां लागू नहीं होता, क्योंकि
integerअपनी श्रेणी में पसंदीदा प्रकार नहीं है (जो किoid. होगा) औरdouble precision), इसलिए नियम 6 का उपयोग किया जाता है:इसका परिणाम एक प्रकार का
integerहोता है ।