XMLTABLEを追加するPavelStěhuleによるパッチをコミットしました PostgreSQL10の機能。XMLTABLE は、SQL / XML標準で規定されている非常に便利な機能であり、XMLデータをリレーショナル形式に変換して、残りのリレーショナルデータと混合できるようにします。この機能には多くの用途があります。詳細については読み続けてください。
おそらくXMLTABLEの最も興味深いユースケース データベース内のETL処理中に、XMLドキュメントからデータを抽出してリレーショナルテーブルに挿入することです。ただし、 XMLTABLE XML列に格納されたデータをオンザフライで使用できるため、データがリレーショナル形式になったら、 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 | room_id | |
---|---|---|
1 | 201 | 3 |
2 | 202 | 5 |
3 | 201 | 2 |
4 | 202 | 2 |
構文の説明
上記のクエリを調べてみましょう。 XMLTABLE 句はFROMに入れる必要があります クエリの一部。 hoteldataもあります FROMで 、これはデータを XMLTABLEにフィードするものです 。
まず、 PASSING 句は、処理するXMLデータを指定する場所です。この場合、データはホテルから取得されます hoteldataの列 テーブル。これをドキュメント式と呼びます 。
PASSINGの直前 XPath式が表示される句'/hotels / hotel / rooms / room' 。これを行生成式と呼びます または単に行式 。
列があります 次の句、いくつかの列を宣言します。列ごとに、データ型とオプションの PATHを示します 列式と呼ばれる句 。
XMLTABLE の動作理論は、行式がドキュメント式に適用され、ドキュメントを細かく分割して行を生成するというものです。そのように生成された行ごとに、さまざまな列式が適用されて、各列の値が取得されます。
列式は、現在の行のXMLから始まる値を取得するXPath式です。 PATHがない場合 が指定されている場合、列名自体がXPath式として使用されます。列hotel_nameに注意してください 「../」のパスを使用しました 「」は、XMLドキュメント内で「上に移動」して、ドキュメント内の「コンテナ」オブジェクトから値を取得することを意味します。 xmlPATH'。'を使用することもできます 行内。これにより、その行の完全なソースXMLが得られます。
1つの列にFORORDINALITYのマークを付けることができます 。その場合、列のタイプは INTEGERになります。 、およびドキュメントから取得した行ごとに順番に番号が付けられます。 (テーブルに複数の行がある場合など、複数の入力ドキュメントがある場合、カウンターは新しいドキュメントごとに1から始まります。)
DEFAULTもあります 句。列のXPathが特定の行の値と一致しない場合、 DEFAULT 値が使用されます。
これらの列の一部は、 NOT NULLとしてマークされています 。一致するものがなく、 DEFAULTがない場合 句が指定されています(または DEFAULT NULLにも評価されます )、エラーがスローされます。
強力な言語であるXPathの詳細については説明しませんが、ウィキペディアのXPathの記事と、W3Cの公式推奨ドキュメントを役立つリソースとして提供できます。
完全なXMLTABLE構文
文書化された構文の概要は次のとおりです。
xmltable
( [XMLNAMESPACES(namespace uri
ASnamespace name
[, ...])]row_expression
PASSING [BY REF]document_expression
[BY REF] COLUMNSname
{type
[PATHcolumn_expression
] [DEFAULTexpr
] [NOT NULL | NULL] | FOR ORDINALITY } [, ...] )
ドキュメント式は、FROM句にあるテーブルへの参照にすることも、文字列リテラルとしての完全なXMLドキュメントにすることもできます。 BYREF句は効果がありません。これらは、標準および他のデータベースシステムとの互換性のためにあります。
XMLNAMESPACESについては説明していません この投稿の条項;将来の分割払いのために残しておきます。
SQLを上に適用する
前述のように、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;
CLP | 1200000 | |
EUR | 80000 | |
ラマンチャ | PTA | 80000 |
結論
この記事では、新機能 XMLTABLEについて説明しました。 PostgreSQLバージョン10に表示されます。XMLTABLE これは外部データを統合するための優れた機能であり、皆さんにも役立つことを願っています。最終リリースの前に問題を解決できるように、テストして問題を報告してください。 XMLTABLEがお好きなら 、コメントを残してお知らせください!