यह फ़ंक्शन प्रकार रिज़ॉल्यूशन . के नियमों द्वारा तय किया जाता है . मैनुअल में विस्तृत विवरण। संबंधित:
- क्या Postgres में फ़ंक्शन ओवरलोडिंग को अक्षम करने का कोई तरीका है
स्पष्ट प्रकार के बिना NULL "अज्ञात" प्रकार के रूप में शुरू होता है:
SELECT pg_typeof(NULL)
pg_typeof
-----------
unknown
असल में, मुझे संदेह हुआ और एक त्वरित परीक्षण चलाया, बस पोस्टग्रेज 9.3 और 9.4 में अलग-अलग परिणाम खोजने के लिए। varchar integer पर चुना जाता है (जो अजीब तरह से आपके निष्कर्षों का खंडन करता है):
एसक्यूएल फिडल.
मुझे लगता है कि नियमानुसार सूची में बिंदु 4e है (पहले के बिंदुओं में से कोई भी मैच तय नहीं करता है):
<ब्लॉकक्वॉट>प्रत्येक पद पर, यदि कोई उम्मीदवार उस श्रेणी को स्वीकार करता है तो स्ट्रिंग श्रेणी का चयन करें। (स्ट्रिंग के प्रति यह पूर्वाग्रह उपयुक्त है क्योंकि अज्ञात-प्रकार का शाब्दिक एक स्ट्रिंग जैसा दिखता है।)
यदि आपने इनपुट प्रकार के साथ कोई अन्य फ़ंक्शन जोड़ा है text अतिभारित मिश्रण के लिए, text varchar . पर चुना जाएगा ।
व्यक्तिगत रूप से मैं लगभग हमेशा text का उपयोग करें varchar . के बजाय . बाइनरी संगत होने के बावजूद (लगभग लगभग समान नहीं), text हर लिहाज से पोस्टग्रेज के दिल के करीब है।
मैंने इसे बेला में जोड़ा, साथ ही एक और उदाहरण जहां पोस्टग्रेज़ निर्णय नहीं ले सकता और एक तंत्र-मंत्र फेंकता है।
यदि आप कोई विशेष फ़ंक्शन चुनना चाहते हैं, तो एक स्पष्ट प्रकार का कास्ट जोड़ें (यही तरीका है यहां जाने का!):
select test(null::int) AS func_int
, test(null::varchar) AS func_vc;