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
    この制約事項は、IS (NOT) NULL 述部には適用されません。
  • 述部に関連する XMLTABLE 関数の結果列にデフォルトの文節がないこと。
  • XMLTABLE 関数に FOR ORDINALITY 列がないこと。
プログラム固有のプログラミングインターフェース情報を終了します。