2011-08-24 18 views
7

यह बयान PostgreSQL 8.2.4 और PHP 5.2.17 साथ काम नहीं करता:

pg_query_params('SELECT $1', array(1)); 
ERROR: could not determine data type of parameter $1 

पर्याप्त मेला। यह एक संभावित फिक्स है:

pg_query_params('SELECT CAST($1 AS INTEGER)', array(1)); 

यह समझ में आता है क्योंकि हम डेटा प्रकार के बारे में स्पष्ट हैं।

लेकिन निम्नलिखित बयान भी काम करता है, हालांकि यह पहली अभिव्यक्ति के बराबर होना चाहिए:

pg_query_params('SELECT COALESCE($1)', array(1)); 

क्यों? क्या COALESCE किसी भी तरह से $ 1 के डेटा प्रकार को संशोधित करता है, या परिणाम के रूप में कुछ सरल डेटा प्रकार की गारंटी देता है?

संपादित करें: The docsCOALESCE के विषय पर अपेक्षाकृत कम है।

+0

Assumably , हाँ। मैं [उस समारोह के दस्तावेज़ों की जांच करूंगा] (http://www.postgresql.org/docs/9.0/interactive/functions-conditional.html#AEN15541)। इसे वापसी मूल्य निर्दिष्ट करना चाहिए - लेकिन मुझे स्पष्टीकरण के लिए मत पूछें :) – hakre

उत्तर

2

coalesce हमेशा पहले गैर-शून्य स्ट्रिंग,
लौट सभी null की स्थिति में आपूर्ति (आपके मामले में, $1 की अपरिभाषित चर रहा है),
यह NULL के लिए सीसा।

NULL अपरिभाषित

क्षमा मेरा बुरा स्पष्टीकरण के रूप में वास्तव में एक ही नहीं है ...

पहला उदाहरण के लिए, आप एक अपरिभाषित चर जो त्रुटि के लिए नेतृत्व वापस जाने के लिए कोशिश कर रहे हैं।

हालांकि, तीसरा उदाहरण में, आप (सम्मिलित द्वारा दिया) एक शून्य मान देने के लिए कोशिश कर रहे हैं,
वहाँ कोई और अधिक अपरिभाषित चर रहा है, बस एक शून्य लौट आए, इस बनाने चयन काम ठीक

+0

क्या आपके पास अंतिम वक्तव्य का संदर्भ है? एक [पूर्ण मूल्य] (https://secure.wikimedia.org/wikipedia/en/wiki/Null_%28SQL%29) "इंगित करता है कि डेटाबेस में डेटा मान मौजूद नहीं है" और 'COALESCE' है (उसी पृष्ठ के अनुसार) "समकक्ष' केस 'कथन के लिए शॉर्टेंड के रूप में परिभाषित किया गया है, लेकिन' चयन करें जब $ 1 नहीं है तो $ 1 END' भी विफल नहीं होता है। – l0b0

+0

चूंकि नल किसी भी डेटा डोमेन का सदस्य नहीं है, इसलिए इसे "मान" नहीं माना जाता है, बल्कि एक मार्कर (या प्लेसहोल्डर) जो आपके द्वारा प्रदान किए गए दस्तावेज़ से मूल्य की अनुपस्थिति को इंगित करता है – ajreal

+0

यह कैसे अंतर को समझाता है 'नूल 'और' अपरिभाषित '? ऐसा लगता है कि बिल्कुल विपरीत है: "कोई मूल्य नहीं" === अपरिभाषित। कम से कम यह [पर्ल] (http://www.postgresql.org/docs/8.4/interactive/plperl-funcs.html) द्वारा उपयोग की जाने वाली व्याख्या है: एसक्यूएल 'न्यूल' → पर्ल 'undef'। – l0b0

संबंधित मुद्दे