IBM Books

管理およびプログラミングの手引き

構造に基づいて XML 文書を検索する

XML エクステンダーの検索機能を使用して、 文書構造つまり要素と属性に基づいて列内の XML データを検索することができます。 列データを検索するには、いくつかの方法で SELECT ステートメントを使用して、 文書の要素および属性との一致に基づく結果セット を戻します。 以下の方式を使用して、列データを検索することができます。

これらの方式については以降の節で解説され、次のシナリオに基づく例が使用されます。 アプリケーション表 SALES_TAB には ORDER という名前の XML 列があります。 この列には 3 つのサイド表、ORDER_SIDE_TAB、PART_SIDE_TAB、および SHIP_SIDE_TAB があります。 デフォルト・ビューの sales_order_view は、ORDER 列が使用可能にされたときに指定され、 以下の CREATE VIEW ステートメントを使用してこれらの表を結合します。

CREATE VIEW sales_order_view(invoice_num, sales_person, order,
                             order_key, customer, part_key, price, date)
     AS
     SELECT sales_tab.invoice_num, sales_tab.sales_person, sales_tab.order,
            order_side_tab.order_key, order_side_tab.customer,
            part_side_tab.part_key, ship_side_tab.date
     FROM sales_tab, order_side_tab, part_side_tab, ship_side_tab
     WHERE sales_tab.invoice_num = order_side_tab.invoice_num
                AND sales_tab.invoice_num = part_side_tab.invoice_num
                AND sales_tab.invoice_num = ship_side_tab.invoice_num

サイド表上での直接照会による検索

副照会検索を伴う直接照会により、サイド表が索引付けされている場合の構造化検索において、 最高のパフォーマンスを得ることができます。 照会または副照会を使用して、サイド表を適切に検索できます。

例: 以下のステートメントは照会または副照会を使用して、 サイド表を直接検索します。

SELECT sales_person from sales_tab
   WHERE invoice_num in
     (SELECT invoice_num from part_side_tab
      WHERE price > 2500.00)

この例で、invoice_num は SALES_TAB 表の基本キーです。

結合ビューからの検索

XML エクステンダーが固有の ID を使用して、 アプリケーション表とサイド表とを結合するデフォルトのビューを作成するようにすることができます。 このデフォルト・ビューか、アプリケーション表とサイド表とを結合する任意のビューを使用して、 列データの検索とサイド表の照会を行うことができます。 この方式は、アプリケーション表とそのサイド表のための、単一の仮想ビューを提供します。 しかし、作成されるサイド表の数が多い場合、照会の負荷は大きくなります。

ヒント: root_id または DXXROOT_ID (XML エクステンダーによって作成される) を使用して、 独自のビューを作成するときに複数の表を結合することができます。

例: 以下のステートメントはビューを検索します。

SELECT sales_person from sales_order_view
        WHERE price > 2500.00

この SQL ステートメントは、在庫品目の注文価格が 2500.00 を超える sales_person の値を、 結合ビュー sales_order_view 表から戻します。

抽出 UDF による検索

さらに、アプリケーション表に索引またはサイド表を作成していないとき、 XML エクステンダーの抽出 UDF を使用して要素および属性を検索することもできます。 抽出 UDF を使用して XML データを走査することは負荷がとても大きいので、 検索に含められる XML 文書の数を制限する WHERE 文節を必ず使用してください。

例: 以下のステートメントは、抽出 XML エクステンダー UDF を使用して検索を行います。

SELECT sales_person from sales_tab
     WHERE extractVarchar(order, '/Order/Customer/Name')
   			like '%IBM%' 	
				AND invoice_num > 100

この例では、抽出 UDF は 値が IBM である </Order/Customer/Name> 要素を抽出します。

複数出現のある要素または属性の検索

複数出現のある要素または属性を検索するときは、 DISTINCT 文節を使用して値の重複を回避してください。

例: 以下のステートメントは、DISTINCT 文節を使用して検索を行います。

SELECT sales_person from sales_tab
            WHERE invoice_num in
              (SELECT DISTINCT invoice_num from part_side_tab
               WHERE price > 2500.00 )

この例では、DAD ファイルにより /Order/Part/Price に複数出現があることが指定され、 そのためのサイド表 PART_SIDE_TAB が作成されます。 PART_SIDE_TAB 表には、同一の invoice_num を持つ行が複数存在する可能性があります。 DISTINCT を使用すると、固有の値だけが戻されます。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]