SELECT 関数

SELECT 関数は、複合メッセージおよびデータベース・データを結合し、フィルターに掛け、変換します。

構文

注:
  1. SELECT 式には、囲むための大括弧は必要なくなりました。 大括弧を使用できないわけではありませんが、大括弧が存在する場合、単なる通常の式範囲の括弧になります。
  2. COUNT パラメーターの場合に限り、以下の Expression の値を 1 つの星印 (*) として指定できます。

使用法

SELECT 関数は、メッセージを変換する方法として一般的で、最も効率的です。SELECT を使用して、以下の操作を実行できます。
  • メッセージを包括的に再フォーマットする
  • データベース表にアクセスする
  • 入力配列のサブセットである出力配列を作成する
  • 入力配列の値のみを含む出力配列を作成する
  • 配列内の項目数をカウントする
  • 配列内のいくつかの項目から最小値および最大値を選択する
  • 配列内の値を合計する

SELECT の紹介

SELECT 関数は、メッセージ・ツリー (またはサブツリー) を、むしろデータベース表のように複数の "row""column" で構成されていると見なします。FROM 文節中の FieldReference は、メッセージ・ツリー中のフィールドを識別し、以下のようにします。
  • 識別されたフィールドは表の "row" と見なされます。
  • このフィールドの兄弟は、同じ "table" の他の "row" と見なされます。
  • このフィールドの子は、この表の "column" と見なされます。
注: FROM 文節中の FieldReference を、実際のデータベース表を直接参照する表参照にすることもできます。

SELECT 関数の戻り値は、通常は別のメッセージ・ツリーで、SelectClause によって構造と内容が判別される "row" が含まれます。結果の行数は、FROM 文節中のすべてのフィールド参照と表参照によって指されているすべての "row" のうち、WHERE 文節によってフィルタリングされたものの合計になります。つまり、WHERE 文節が TRUE に評価されるフィールドのみ含まれます。

SELECT 関数の戻り値をスカラーにすることもできます (ITEM 選択を参照)。

複数の方法で SelectClause を指定できます。以下を参照してください。

単純選択

SELECT 関数の詳細について理解するために、まず以下のような単純な事例について考慮しましょう。
  • SelectClause が複数の式で構成され、個々の式に 1 つの AS Path 文節があります。
  • FROM 文節に 1 つの FieldReference と AS CorrelationName 文節があります。
SELECT 関数はローカル変数、参照変数、または相関変数 (AS CorrelationName 文節によって名前が指定される) を作成してから、FROM 文節から派生した行リスト中の個々の "row" を順番にステップスルーします。"row" ごとに、以下を行います。
  1. 相関変数が、現在の "row" を指すように設定されます。
  2. WHERE 文節 (ある場合) が評価されます。FALSE または不明 (ヌル) に評価されると、結果ツリーには何も追加されず、処理は入力の次の "row" に進みます。それ以外の評価の場合は、処理は次のステップに進みます。
  3. 結果リストに新しいメンバーが追加されます。
  4. SELECT 文節式が評価され、AS Path 文節の指示どおりに名前指定されたフィールドに割り当てられます。これらのフィールドは、結果リストの新しいメンバーの子フィールドになります。

通常、SelectClause 式と WHERE 文節式は両方とも相関変数を使用して "column" 値 (つまり、入力メッセージ・ツリー中のフィールド) にアクセスするので、入力メッセージからのデータを含む新しいメッセージ・ツリーが構築されます。相関変数は AS CorrelationName 文節で指定された名前により参照されるか、または AS 文節が指定されていない場合は、FROM FieldReference 中の最後の名前 (つまり、最後のドットの後の名前) によって参照されます。

以下の点に注意してください。
  • 表に似てはいますが、表のようなフラットな構造を持つメッセージのアクセスや作成しか行えないように制限されてはいません。任意の深さのフォルダー構造を持つツリーのアクセスや構築を行えます。
  • "column" が単一値になるように制限されていません。列を反復リスト値や構造にすることができます。
これらの概念を理解するには、例を参照するのが最善です。

フィールド参照が実際には TableReference の場合、操作は非常に似たものになります。この場合、入力は実際のデータベース表になるので、データベースによってサポートされるフラットな構造に制限されます。しかし、結果のツリーには依然として制限はありません。

FROM 文節中に複数のフィールド参照がある場合は、右端の参照は個々の行を右端から 2 番目の参照の行ごとにステップスルーし、以後同様になります。したがって、結果の行の総数は、個々の表の行数の積になります。この種の選択のことを結合 といい、普通は結果からこれらの行のほとんどを除外する WHERE 文節が使用されます。結合は、普通はデータベースのデータをメッセージに追加するために使用されます。

AS Path 文節はオプションです。この文節を指定しないと、ブローカーは以下の規則に従ってデフォルトの名前を生成します。
  1. SelectClause 式がフィールドに対する参照か、フィールドに対する参照のキャストの場合、そのフィールドの名前が使用されます。
  2. それ以外の場合は、ブローカーはデフォルトの名前 "Column1""Column2"、(以後同様) を使用します。

以下の例は、データベース "DSN1" のスキーマ "Shop" において、テーブル "Parts" で SELECT を実行します。WHERE 文節がないため、すべての行が選択されます。 選択文節式 (P.PartNumber など) は AS 文節を含まないため、結果フィールドは同じ名前を取り入れます。

SET PartsTable.Part[] = SELECT
  P.PartNumber,
  P.Description,
  P.Price
 FROM Database.DSN1.Shop.Parts AS P;

SET ステートメントのターゲット ("PartsTable") が ROW 型の変数の場合、ステートメントの実行後、PartsTable は、そのルート・エレメントの子として、表の各行に "Part" と呼ばれるフィールドを持ちます。それぞれの "Part" フィールドは、"PartNumber""Description"、および "Price" と呼ばれる子フィールドを持ちます。 子フィールドは、表の内容に支配される値を持ちます ("PartsTable" はメッセージ・ツリーの参照にもなります)。

次の例では、類似した SELECT を実行します。この事例は、最初の例で作成されたメッセージ・ツリー (実データベース表でない) において SELECT を実行する点で、前の事例と異なります。結果は "OutputRoot" のサブフォルダーに割り当てられます。

SET OutputRoot.XML.Data.TableData.Part[] = SELECT
  P.PartNumber,
  P.Description,
  P.Price
 FROM PartsTable.Part[] AS P;

INSERT 選択

INSERT 文節は AS 文節の代わりになります。この文節は、SelectClause 式の結果 (行でなければならない) を、現在の新しい行の子ではなくその行自体に割り当てます。そのため、式の結果の行が、SELECT によって生成される行にマージされます。AS 文節はこの点で異なります。AS 文節は常に結果を追加する前に 1 つ以上の子エレメントを生成しますが、INSERT は生成しません。他の SELECT 操作からのデータを挿入する際には INSERT が便利です。なぜなら、フォルダーを追加せずにデータをマージできるからです。

ITEM 選択

SelectClause を、キーワード ITEM と 1 つの式から構成できます。この場合、結果には名前がありません。つまり、結果は行ではなく、式によって戻されるタイプの値のリストになります。このオプションには以下のような使用法があります。
  • スカラー式および THE 関数と併用して、1 つのスカラー値 (例えば、表中の特定の項目の価格) を戻す SELECT 照会を作成できます。
  • CASE 式および ROW コンストラクターと併用して、"row" の構造 (つまり、メッセージ中の反復) が異なる複数のメッセージの作成や処理を行う SELECT 照会を作成できます。この使用法は、複数のメッセージに反復構造があるが、それらの反復の構造がすべて同じではない場合に、それらのメッセージを処理するのに便利です。
  • ROW コンストラクターと併用すると、入力メッセージ中の反復のレベルを縮小する SELECT 照会を作成できます。

列関数選択

SelectClause を、式上で動作する関数 COUNT、MAX、MIN、および SUM のいずれかで構成できます。これらの関数のことを列関数といいます。それは 1 つのスカラー値 (リストではない) を戻し、FROM 文節の行をステップスルーして Expression が評価したカウント、最大、最小、または合計の値が示されます。Expression が特定の行を NULL に評価すると、その値は無視されるので、この関数は残りの行のカウント、最大、最小、または合計を戻します。

COUNT 関数に限り、Expression を 1 つの星印 (*) で構成できます。この形式の場合、ヌル値かどうかにかかわらず行をカウントします。

結果に入力メッセージを適切に反映させるには、通常は Expression に相関変数を組み込みます。

通常、Expression は行ごとに同じデータ・タイプに評価します。これらの場合、MAX、MIN、および SUM 関数の結果は、オペランドと同じデータ・タイプになります。しかし、戻り値はすべて同じタイプである必要はなく、同じでない場合は通常の演算の規則が適用されます。例えば、反復メッセージ構造中のフィールドで、ある行の場合は整数値が含まれ、他の行の場合は浮動小数点値であれば、合計は通常の加算の規則に従います。整数値と浮動小数点値を加算することと同等の操作になるので、タイプは浮動小数点になります。

COUNT 関数の結果は常に整数になります。

メッセージ選択とデータベース選択との違い

FROM 式の相関変数がメッセージ中の行を表す場合と、実際のデータベース表の行を表す場合では、動作が多少違います。

メッセージの場合は、星印 (*) を含むパスは通常の意味になります。フィールドの名前を無視し、他の基準と一致する最初のフィールドを (ある場合) 検出します。

データベースの場合、過去の経緯から、星印 (*) には "すべてのフィールド" という特別な意味があります。この特別な意味の場合、データベース表の定義に関する上級の知識が必要で、デフォルトのデータベース (つまり、ノードの data source 属性によって指されるデータベース) を照会する場合のみサポートされます。例えば、以下の照会ではデフォルト・データベースを照会する場合にのみ、列名/値のペアが戻されます。
SELECT * FROM Database.Datasource.SchemaName.Table As A
SELECT A.* FROM Database.Datasource.SchemaName.Table As A
SELECT A FROM Database.Datasource.SchemaName.Table AS A

SELECT 式の指定

SelectClause
SelectClause 式はすべてのブローカーの演算子および関数をどのような組み合わせでも使用できます。この式は、表の列、メッセージ・フィールド、包含している SELECT によって宣言された相関名、および有効範囲内にある他の宣言済み変数や定数を参照できます。
AS Path
AS Path 式は相対パス (つまり、相関名はありません) ですが、それ以外の点では制限はありません。例えば、以下を含むことができます。
  • 索引 (A.B.C[i] など)
  • フィールド・タイプ指定子 (A.B.(XML.Attribute)C など)
  • 複数パーツ・パス (A.B.C など)
  • 名前式 (A.B.{var} など)

これらのパス内の式も、すべてのブローカーの演算子および関数をどのような組み合わせでも使用できます。式は、表の列、メッセージ・フィールド、包含している SELECT によって宣言された相関名、および任意の宣言済み変数や定数を参照できます。

FROM 文節
FROM 文節式には複数のデータベース参照、複数のメッセージ参照、またはこれら 2 つの参照を組み合わせたものが含まれます。そのため、表と表、メッセージとメッセージ、メッセージと表を結合できます。

FROM 文節 FieldReference には、任意の種類の式を含めることができます (例えば、Database.{DataSource}.{Schema}.Table1)。

実行時にフィールド、データ・ソース、スキーマ、または表の名前を計算できます。

WHERE 文節

WHERE 文節式はすべてのブローカーの演算子および関数をどのような組み合わせでも使用できます。この式は、表の列、メッセージ・フィールド、および宣言済み変数や定数を参照できます。

しかし、ブローカーは式を検証し、データベースが式全体を評価可能であるかを判別して、WHERE 文節式を扱うことに注意してください。可能である場合、式はデータベースに渡されます。データベースによる評価が可能であるためには、データベースでサポートされる関数と演算子だけを使用しなければなりません。

しかし、WHERE 文節は、メッセージ・フィールド、包含している SELECT によって宣言された相関名、および有効範囲内にある他の宣言済み変数や定数を参照できます。

データベースが式全体を評価できない場合は、ブローカーはトップレベルの AND 演算子を検索し、副次式を別々に検証します。それから、ブローカーに残りの副次式を評価させたまま、データベースに評価可能な副次式を渡すよう試みます。 この状態に関して以下の 2 つの理由で注意が必要です。
  1. WHERE 文節式への小さな変更であっても、パフォーマンスに大きく影響する場合があります。ユーザー・トレースを調べることにより、データベースに対してどれほどの式が渡されているかを判別できます。
  2. データベースの関数の中には、ブローカーの関数とわずかに動作が異なるものがあります。

THE 関数との関係

THE 関数 (リストの最初のエレメントを戻す) を SELECT と併用して、リストでない結果を作成できます。この方法は、例えば SELECT 照会が 1 つ以下の項目を戻す必要がある場合に便利です。特に、ITEM と併用すると便利です (ITEM 選択を参照)。

SQL 規格との違い

ESQL SELECT は、データベースの SQL SELECT と次の点で異なっています。
  • ESQL はツリー構造の結果データを生成できます
  • ESQL は SELECT 文節に配列を受け入れることができます
  • ESQL には THE 関数と ITEM および INSERT パラメーターがあります
  • このリリースでは、ESQL には SELECT ALL 関数がありません
  • このリリースでは、ESQL には ORDER BY 関数がありません
  • このリリースでは、ESQL には SELECT DISTINCT 関数がありません
  • このリリースでは、ESQL には GROUP BY または HAVING パラメーターがありません
  • このリリースでは、ESQL には AVG 列関数がありません

制約事項

以下の制約事項が現行リリースに適用されます。
  • 複数のデータベース表上で SELECT コマンドが動作する場合には、すべての表が同じデータベース・インスタンス中になければなりません。(つまり、TableReference 間で指定されているデータ・ソース名が違っていてはなりません。)
  • FROM 文節がメッセージと表の両方を参照する場合、リスト中で表がメッセージよりも先でなければなりません。
関連概念
ESQL の概要
関連タスク
ESQL の開発
単純な XML メッセージの変換
複雑な XML メッセージの変換
XML メッセージでスカラー値を戻す
ESQL からデータベースへのアクセス
関連資料
構文図: 使用可能なタイプ
複合 ESQL 関数
特記事項 | 商標 | ダウンロード | ライブラリー | サポート | フィードバック
Copyright IBM Corporation 1999, 2006 最終更新: 08/21/2006
ak05620_