PostgreSQL - CAST बनाम :: LATERAL टेबल फ़ंक्शन पर ऑपरेटर

Nov 27 2020

जबकि मैं कर सकता हूं

SELECT elem[1], elem[2]
FROM   ( VALUES ('1,2'::TEXT) ) AS q(arr),
       LATERAL CAST(String_To_Array(q.arr, ',') AS INT[]) AS elem
;

एक स्पष्ट कॉल का उपयोग करके CAST, मैं नहीं कर सकता

SELECT elem[1], elem[2]
FROM   ( VALUES ('1,2'::TEXT) ) AS q(arr),
       LATERAL String_To_Array(q.arr, ',')::INT[] AS elem
;

अंतर्निहित कॉलिंग ::ऑपरेटर का उपयोग करना :

त्रुटि: "::" पर या निकट सिंटैक्स त्रुटि

एक अन्य स्थान जिस पर एक स्पष्ट CASTआवश्यकता है:

CREATE INDEX ON ... ( CAST(<straw> AS <gold>) );

मुझे संदेह है कि एक सिंथेटिक कारण है, उदाहरण के लिए अतिरिक्त एन्कोडिंग कोष्ठक का उपयोग करना - जो यहां गलत है।

क्या इस स्तर पर स्पष्ट फ़ंक्शन कॉल की आवश्यकता निम्न स्तर के कार्यान्वयन के हिस्से के रूप में है? या यह किसी भी भाषा के नियमों का पालन करता है?

जवाब

5 ErwinBrandstetter Nov 27 2020 at 11:35

उत्कृष्ट कोने का उदाहरण। ये दोनों सिंटेक्स वेरिएंट "स्पष्ट प्रकार के कास्ट" हैं, बिल्कुल वैसा ही कर रहे हैं। यह सिर्फ इतना होता है कि SQL कोड में कुछ विशेष स्थान केवल अस्पष्टता से बचने के लिए कार्यात्मक संकेतन की अनुमति देते हैं।

आपके दूसरे अवलोकन के लिए:

एक अन्य स्थान जिस पर एक स्पष्ट CASTआवश्यकता है:

CREATE INDEX ON ... ( CAST(<straw> AS <gold>) );

शॉर्टहैंड सिंटैक्स का उपयोग वास्तव में यहां किया जा सकता है - इसे अपवित्र बनाने के लिए कोष्ठक के अतिरिक्त सेट के साथ:

CREATE INDEX ON ... ((<straw>::<gold>));

db <> फिडल यहां

और या तो वाक्यविन्यास संस्करण प्रश्नों में अन्य अभिव्यक्ति से मेल खाता है, भी। देख:

  • क्या हम JSONB डेटा प्रकार की कुंजी / मान के लिए इंडेक्स बना सकते हैं?
  • कैसे एक पूर्णांक json संपत्ति पर अनुक्रमणिका में एक अनुक्रमणिका बनाने के लिए
  • रेस्टोरेंट रिजर्वेशन स्कीम के लिए 2 कॉलमों में डेटाटाइम विभाजित करना?

(आपके पहले उदाहरण में क्या करने के लिए अधिक कुशल तरीके हैं, लेकिन यह संभवतः बिंदु के बगल में है।)

5 LaurenzAlbe Nov 27 2020 at 10:27

यह थोड़ा अजीब है, हां, लेकिन व्याकरण केवल फ़ंक्शन-इन-एफआरओएम अभिव्यक्ति में एक फ़ंक्शन कॉल के समान कुछ कृत्रिम रूप से स्वीकार करेगा।

तो यह वास्तव में एक चाल है जिसका उपयोग आप कर सकते हैं यदि आप एक FROMखंड में एक मनमाना अभिव्यक्ति चाहते हैं : एक अनावश्यक CASTअभिव्यक्ति के साथ इसे घेर लें ।

PostgreSQL खुशी से कुछ भी व्यवहार करेगा जो इस तरह के संदर्भ में एक टेबल फ़ंक्शन के रूप में कार्य करता है।