SQL 述部から XML 述部へのトランスフォーメーション
Db2 は、SQL 照会を変換して、述部が適用されるタイミングを変更し、照会のパフォーマンスを向上させることがあります。 Db2 は、このような変換を使用して、XMLTABLE 関数に組み込まれている XPath 式に SQL 述部をプッシュすることができます。
例えば、次の照会は 1991 以降に発行されたすべての書籍を検出し、それぞれについてタイトルと発行元をリストします。
SELECT X.*
FROM T1,
XMLTABLE('/bib/book'
PASSING T1.bib_xml
COLUMNS YEAR INT PATH '@year',
TITLE VARCHAR(30) PATH 'title',
PUBLISHER VARCHAR(30) PATH 'publisher') X
WHERE X.YEAR > 1991;
Db2 XMLTABLE関数で 述語を処理するようにクエリを書き換えることができます。 WHERE X.YEAR > 1991 書き直された照会ではオリジナルの述部は、次のように
XMLTABLE 関数の row-xpath-expression に関連付けられた XPath 述部になります。
SELECT X.*
FROM T1,
XMLTABLE('/bib/book[@year>1991]'
PASSING T1.bib_xml
COLUMNS YEAR INT PATH '@year',
TITLE VARCHAR(30) PATH 'title',
PUBLISHER VARCHAR(30) PATH 'publisher') X
短縮形と末尾ブランクの影響
末尾ブランクが意味を持たない SQL と異なり、XPath では末尾ブランクは意味を持ちます。 例えば、以下のクエリには追加の述語が含まれています。 X.publisher = 'Addison-Wesley':
SELECT *
FROM T1,
XMLTABLE('/bib/book'
PASSING T1.bib_xml
COLUMNS year INT PATH '@year',
title VARCHAR(30) PATH 'title',
publisher VARCHAR(30) PATH 'publisher') X
WHERE X.year > 1991
AND X.publisher = 'Addison-Wesley';パブリッシャーが、varchar(30)にキャストされる可能性があり、元のXMLデータに末尾ブランクがある可能性があるため、Db2は、述部をXPathにプッシュするためにSQLセマンティクスをシミュレートするために、内部オペレーターのdb2:rtrimを追加する必要があります。 以下に示すとおりです。 述部X.publisher = 'Addison-Wesley'は[db2:rtrim(publisher,30)="Addison-Wesley"]に変換されます。
XMLTABLE 内の XML 述部へのトランスフォーメーションの対象になる述部
次の条件を満たす述部はトランスフォーメーションの対象になり、XMLTABLE 関数によって処理できます。
- 述部は、以下のいずれかの形式を持っている必要があります。(opは、=、<、>、<=、>=または<>のいずれかの演算子を表します。)
- 列 op 定数、パラメーター、またはホスト変数。列は 結果表から。
- 列 op 列。左側の列は結果表から、右側の列は結果表またはいずれかの入力表から。
- 列 op 式。列は結果表から、 式は入力表からの列のみ含む任意の SQL 式。
- 上記フォームのいずれかにトランスフォームできる BETWEEN 述部。
- COLUMN IS (NOT) NULL
- 上記の各フォームを AND および OR で結合して構成される述部。
- 列 (NOT) IN (式 1,..., 式 n) ここで、列は結果テーブルから取得され、結果テーブルの列または結果テーブルの列も入力テーブルではないテーブルの列も含まないSQL式のいずれかの式です。
- 述部はブール項述部であること。
- 述部は、結合操作の前に適用できること。
- 述部に関連する XMLTABLE 関数の結果列が、次のデータ・タイプのいずれでもないこと。
- 日付
- 時刻
- TIMESTAMP
- DECFLOAT(16)
- REAL
- DOUBLE
- 述部に関連する XMLTABLE 関数の結果列にデフォルトの文節がないこと。
- XMLTABLE 関数に FOR ORDINALITY 列がないこと。