xpath()
समारोह:
WITH x(col) AS (SELECT '<?xml version="1.0" ?><response><status>ERROR_MISSING_DATA</status></response>'::xml)
SELECT xpath('./status/text()', col) AS status
FROM x
/text() आस-पास की पट्टी <status> टैग.xml . की एक सरणी देता है - इस मामले में एक ही तत्व के साथ:
status
xml[]
-------
{ERROR_MISSING_DATA}
आपकी तालिका पर लागू
आपके प्रश्न अपडेट के जवाब में, यह बस हो सकता है:
SELECT id, xpath('./status/text()', response::xml) AS status
FROM tbl;
यदि आप सुनिश्चित हैं कि प्रति पंक्ति केवल एक स्थिति टैग है, तो आप केवल सरणी से पहला आइटम निकाल सकते हैं:
SELECT id, (xpath('./status/text()', response::xml))[1] AS status
FROM tbl;
अगर कई स्टेटस आइटम हो सकते हैं:
SELECT id, unnest(xpath('./status/text()', response::xml)) AS status
FROM tbl;
आपको प्रति id . के लिए 1-n पंक्तियाँ प्राप्त करता है ।
xml पर कास्ट करें
चूंकि आपने अपने कॉलम को text . प्रकार के रूप में परिभाषित किया है (xml के बजाय
, आपको जरूरत xml . पर डालने के लिए स्पष्ट रूप से। फंक्शन xpath() xml . प्रकार के दूसरे पैरामीटर की अपेक्षा करता है . टाइप न किए गए स्ट्रिंग स्थिरांक को xml . के साथ ज़बरदस्ती लगाया जाता है स्वचालित रूप से, लेकिन एक text स्तंभ नहीं है। आपको स्पष्ट रूप से कास्ट करने की आवश्यकता है।
यह स्पष्ट कलाकारों के बिना काम करता है:
SELECT xpath('./status/text()'
,'<?xml version="1.0" ?><response><status>SUCCESS</status></response>')
एक सीटीई जैसे मेरे पहले उदाहरण में जरूरत "सामान्य तालिका अभिव्यक्ति" में प्रत्येक कॉलम के लिए एक प्रकार। यदि मैंने किसी विशिष्ट प्रकार के लिए नहीं डाला होता, तो टाइप unknown इस्तेमाल किया गया होगा - जो कि नहीं है अनटाइप्ड स्ट्रिंग . के समान ही . जाहिर है, unknown . के बीच कोई सीधा रूपांतरण लागू नहीं किया गया है और xml . आपको text में डालना होगा पहला:unknown_type_col::text::xml . ::xml में डालना बेहतर है तुरंत।
इसे PostgreSQL 9.1 (मुझे लगता है) के साथ कड़ा किया गया है। पुराने संस्करण अधिक अनुमेय थे।
किसी भी तरह से, इनमें से किसी भी तरीके से स्ट्रिंग को वैध xml . होना चाहिए या कास्ट (अंतर्निहित या स्पष्ट) एक अपवाद उठाएगा।