PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PostgreSQL में XMLTABLE

मैंने अभी-अभी Pavel Stěhule द्वारा एक पैच किया है जो XMLTABLE जोड़ता है PostgreSQL 10 की कार्यक्षमता।  XMLTABLE SQL/XML मानक द्वारा निर्धारित एक बहुत ही उपयोगी विशेषता है, जो आपको अपने XML डेटा को संबंधपरक रूप में बदलने देती है, ताकि आप इसे अपने शेष संबंधपरक डेटा के साथ मिला सकें। इस सुविधा के कई उपयोग हैं; इसके बारे में कुछ विवरण के लिए पढ़ते रहें।

XMLTABLE . का शायद सबसे दिलचस्प उपयोग मामला इन-डेटाबेस ईटीएल प्रसंस्करण के दौरान, एक संबंधपरक तालिका में सम्मिलित करने के लिए कुछ एक्सएमएल दस्तावेज़ से डेटा निकालना है। हालांकि, XMLTABLE एक्सएमएल कॉलम में संग्रहीत डेटा पर ऑन-द-फ्लाई का उपयोग किया जा सकता है, ताकि एक बार डेटा रिलेशनल रूप में हो, तो आप किसी भी मानक संचालन को लागू कर सकते हैं, जैसे WHERE जोड़ना खंड, एकत्रीकरण करना, अन्य तालिकाओं में शामिल होना, और इसी तरह।

एक साधारण उदाहरण

एक उदाहरण के रूप में, मान लें कि आप एक होटल श्रृंखला का प्रबंधन करते हैं, और यह कि डेटा इस प्रकार संग्रहीत किया जाता है:

CREATE TABLE hoteldata AS SELECT xml
$$<hotels>
 <hotel id="mancha">
  <name>La Mancha</name>
  <rooms>
   <room id="201"><capacity>3</capacity><comment>Great view of the Channel</comment></room>
   <room id="202"><capacity>5</capacity></room>
  </rooms>
  <personnel>
   <person id="1025">
    <name>Ferdinando Quijana</name><salary currency="PTA">45000</salary>
   </person>
  </personnel>
 </hotel>
  <hotel id="valpo">
  <name>Valparaíso</name>
  <rooms>
   <room id="201"><capacity>2</capacity><comment>Very noisy</comment></room>
   <room id="202"><capacity>2</capacity></room>
  </rooms>
  <personnel>
   <person id="1026"><name>Katharina Wuntz</name><salary currency="EUR">50000</salary></person>
   <person id="1027"><name>Diego Velázquez</name><salary currency="CLP">1200000</salary></person>
  </personnel>
 </hotel>
</hotels>$$ AS hotels;

XMLTABLE . के साथ , आप इसे अपनी श्रृंखला के प्रत्येक होटल के लिए व्याख्या करते हुए, कमरे की संख्या और क्षमता वाली एक संबंधपरक रूप से स्वरूपित तालिका में बदल सकते हैं:

SELECT xmltable.*
  FROM hoteldata,
       XMLTABLE ('/hotels/hotel/rooms/room' PASSING hotels
                 COLUMNS
                    id FOR ORDINALITY,
                    hotel_name text PATH '../../name' NOT NULL,
                    room_id int PATH '@id' NOT NULL,
                    capacity int,
                    comment text PATH 'comment' DEFAULT 'A regular room'
                );
id hotel_name room_id क्षमता टिप्पणी
1 ला मंच 201 3 चैनल का शानदार दृश्य
2 ला मंच 202 5 एक नियमित कमरा
3 Valparaíso 201 2 बहुत शोर है
4 Valparaíso 202 2 एक नियमित कमरा

सिंटैक्स की व्याख्या करना

आइए ऊपर दिए गए प्रश्न का अध्ययन करें। XMLTABLE खंड FROM . में जाना चाहिए क्वेरी का हिस्सा। हमारे पास होटल डेटा . भी है से . में , जो डेटा को XMLTABLE . में फीड करता है ।

सबसे पहले, पासिंग क्लॉज वह जगह है जहां हम एक्सएमएल डेटा निर्दिष्ट करते हैं जिसे हम संसाधित करना चाहते हैं। इस मामले में, डेटा होटल . से आता है होटलडेटा . में कॉलम टेबल। हम इसे दस्तावेज़ अभिव्यक्ति . कहते हैं ।

पासिंग . से ठीक पहले खंड आपको एक XPath व्यंजक '/hotel/hotel/rooms/room' दिखाई देता है . हम इसे पंक्ति जनरेटिंग एक्सप्रेशन . कहते हैं या सिर्फ पंक्ति अभिव्यक्ति

हमारे पास COLUMNS . है खंड अगला, कुछ कॉलम घोषित करते हुए। प्रत्येक कॉलम के लिए हम एक डेटा प्रकार के साथ-साथ एक वैकल्पिक PATH . इंगित करते हैं क्लॉज, जिसे हम कॉलम एक्सप्रेशन . कहते हैं ।

XMLTABLE संचालन का सिद्धांत यह है कि पंक्ति अभिव्यक्ति को दस्तावेज़ अभिव्यक्ति पर लागू किया जाता है, पंक्तियों को उत्पन्न करने के लिए दस्तावेज़ को टुकड़ों में काट दिया जाता है; इस प्रकार उत्पन्न प्रत्येक पंक्ति के लिए, प्रत्येक स्तंभ के लिए मान प्राप्त करने के लिए विभिन्न स्तंभ व्यंजक लागू किए जाते हैं।

कॉलम एक्सप्रेशन एक XPath एक्सप्रेशन है जो मौजूदा पंक्ति के लिए एक्सएमएल से शुरू होने वाला मान प्राप्त करता है। यदि नहीं पथ निर्दिष्ट किया जाता है, तो स्तंभ नाम का उपयोग स्वयं XPath व्यंजक के रूप में किया जाता है। ध्यान दें कि hotel_name . कॉलम में हमने "../ . वाले पथ का उपयोग किया है “, जिसका अर्थ है दस्तावेज़ में “कंटेनर” ऑब्जेक्ट से मान प्राप्त करने के लिए XML दस्तावेज़ में “ऊपर जाना”। हम xml PATH' का भी उपयोग कर सकते हैं। एक पंक्ति में, जो हमें उस पंक्ति के लिए पूर्ण स्रोत XML देता है।

एक कॉलम को ORDINALITY के लिए . के रूप में चिह्नित किया जा सकता है . तब कॉलम INTEGER . प्रकार का होता है , और दस्तावेज़ से प्राप्त प्रत्येक पंक्ति के लिए क्रमिक रूप से क्रमांकित किया जाता है। (यदि कई इनपुट दस्तावेज़ हैं, जैसे कि जब आपके पास एक तालिका में कई पंक्तियाँ हों, तो काउंटर प्रत्येक नए दस्तावेज़ के लिए 1 से शुरू होता है)।

एक DEFAULT . भी है खंड। यदि किसी स्तंभ के लिए XPath किसी निश्चित पंक्ति के मान से मेल नहीं खाता है, तो DEFAULT मान का उपयोग किया जाता है।

इनमें से कुछ स्तंभों को NOT NULL . के रूप में चिह्नित किया गया है . अगर कोई मैच नहीं है, और कोई DEFAULT . नहीं है खंड निर्दिष्ट है (या डिफ़ॉल्ट NULL . का भी मूल्यांकन करता है ), एक त्रुटि फेंकी जाती है।

मैं XPath के अधिक विवरण में नहीं जाऊंगा, जो एक शक्तिशाली भाषा है, लेकिन मैं विकिपीडिया में XPath लेख और उपयोगी संसाधनों के रूप में W3C के आधिकारिक अनुशंसा दस्तावेज़ की पेशकश कर सकता हूं।

पूर्ण XMLTABLE सिंटैक्स

प्रलेखित वाक्य रचना सारांश है:

xmltable( [XMLNAMESPACES(namespace uri AS namespace name[, ...])] row_expression PASSING [BY REF] document_expression [BY REF] COLUMNS name { type [PATH column_expression] [DEFAULT expr] [NOT NULL | NULL] | FOR ORDINALITY } [, ...] )

ध्यान दें कि दस्तावेज़ अभिव्यक्ति आपके पास FROM खंड में मौजूद कुछ तालिका का संदर्भ हो सकती है, या यह एक स्ट्रिंग अक्षर के रूप में एक पूर्ण XML दस्तावेज़ हो सकता है। BY REF क्लॉज का कोई प्रभाव नहीं पड़ता है; वे मानक और अन्य डेटाबेस सिस्टम के साथ संगतता के लिए हैं।

मैंने XMLNAMESPACES . को कवर नहीं किया है इस पोस्ट में खंड; मैं इसे भविष्य की किस्त के लिए छोड़ रहा हूं।

एसक्यूएल को शीर्ष पर लागू करना

जैसा कि उल्लेख किया गया है, एक बार XMLTABLE ने डेटा को रिलेशनल रूप में संसाधित कर दिया है, तो आप जाने-माने टूल का उपयोग करके जो चाहें कर सकते हैं। उदाहरण के लिए, यदि आपके पास प्रत्येक होटल में अधिक कर्मियों वाला एक और XML दस्तावेज़ था,

INSERT INTO hoteldata VALUES (xml
$$<hotels> 
 <hotel id="mancha">
  <name>La Mancha</name>
  <personnel>
   <person id="1028">
    <name>Sancho Panza</name><salary currency="PTA">35000</salary>
   </person>
  </personnel>
 </hotel>
 <hotel id="valpo">
  <name>Valparaíso</name>
  <personnel>
   <person id="1029"><name>Kurt Werner</name><salary currency="EUR">30000</salary></person>
  </personnel>
 </hotel>
</hotels>$$);

प्रत्येक होटल में भुगतान की जाने वाली प्रत्येक मुद्रा के लिए कुल वेतन प्राप्त करना आसान है,

  SELECT hotel, currency, sum(salary)
    FROM hoteldata,
XMLTABLE ('/hotels/hotel/personnel/person' PASSING hotels
       COLUMNS hotel text PATH '../../name' NOT NULL,
               salary integer PATH 'salary' NOT NULL,
               currency text PATH 'salary/@currency' NOT NULL
) GROUP BY hotel, currency;
<वें संरेखण ="केंद्र">योग
होटल मुद्रा
Valparaíso CLP 1000000
Valparaíso EUR 80000
ला मंच PTA 80000

निष्कर्ष

इस लेख में, मैंने नई सुविधा XMLTABLE . को कवर किया है PostgreSQL संस्करण 10 में प्रदर्शित होने के लिए। मुझे लगता है कि XMLTABLE बाहरी डेटा को एकीकृत करने के लिए एक बढ़िया विशेषता है, और मुझे आशा है कि आपको यह मूल्यवान भी लगेगा। कृपया इसका परीक्षण करें और किसी भी समस्या की रिपोर्ट करें, ताकि हम अंतिम रिलीज से पहले उनका समाधान कर सकें। अगर आपको XMLTABLE . पसंद है , एक टिप्पणी छोड़कर हमें बताना सुनिश्चित करें!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सम्मिलित तालिका से चयन करते हुए, एक ही क्वेरी में कई तालिकाओं में पंक्तियों को सम्मिलित करें

  2. PostgreSQL में दो तिथियों के बीच परिणाम प्राप्त करना

  3. PostgreSQL विंडो फ़ंक्शन:तुलना द्वारा विभाजन

  4. पोस्टग्रेज में एक टेबल (इंडेक्स सहित) कॉपी करें

  5. एक इनपुट सरणी के आधार पर यूपीएसईआरटी के फ़ंक्शन में सुधार करना