構文
使用法
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" ごとに、以下を行います。
- 相関変数が、現在の "row" を指すように設定されます。
- WHERE 文節 (ある場合) が評価されます。FALSE または不明 (ヌル) に評価されると、結果ツリーには何も追加されず、処理は入力の次の "row" に進みます。それ以外の評価の場合は、処理は次のステップに進みます。
- 結果リストに新しいメンバーが追加されます。
- SELECT 文節式が評価され、AS Path 文節の指示どおりに名前指定されたフィールドに割り当てられます。これらのフィールドは、結果リストの新しいメンバーの子フィールドになります。
通常、SelectClause 式と WHERE 文節式は両方とも相関変数を使用して "column" 値 (つまり、入力メッセージ・ツリー中のフィールド) にアクセスするので、入力メッセージからのデータを含む新しいメッセージ・ツリーが構築されます。相関変数は AS CorrelationName 文節で指定された名前により参照されるか、または AS 文節が指定されていない場合は、FROM FieldReference 中の最後の名前 (つまり、最後のドットの後の名前) によって参照されます。
以下の点に注意してください。
- 表に似てはいますが、表のようなフラットな構造を持つメッセージのアクセスや作成しか行えないように制限されてはいません。任意の深さのフォルダー構造を持つツリーのアクセスや構築を行えます。
- "column" が単一値になるように制限されていません。列を反復リスト値や構造にすることができます。
これらの概念を理解するには、例を参照するのが最善です。
フィールド参照が実際には TableReference の場合、操作は非常に似たものになります。この場合、入力は実際のデータベース表になるので、データベースによってサポートされるフラットな構造に制限されます。しかし、結果のツリーには依然として制限はありません。
FROM 文節中に複数のフィールド参照がある場合は、右端の参照は個々の行を右端から 2 番目の参照の行ごとにステップスルーし、以後同様になります。したがって、結果の行の総数は、個々の表の行数の積になります。この種の選択のことを結合 といい、普通は結果からこれらの行のほとんどを除外する WHERE 文節が使用されます。結合は、普通はデータベースのデータをメッセージに追加するために使用されます。
AS
Path 文節はオプションです。この文節を指定しないと、ブローカーは以下の規則に従ってデフォルトの名前を生成します。
- SelectClause 式がフィールドに対する参照か、フィールドに対する参照のキャストの場合、そのフィールドの名前が使用されます。
- それ以外の場合は、ブローカーはデフォルトの名前 "Column1"、"Column2"、(以後同様) を使用します。
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 *
SELECT A.*
SELECT A FROM Database.Datasource.SchemaName.Table
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 つの理由で注意が必要です。
- WHERE 文節式への小さな変更であっても、パフォーマンスに大きく影響する場合があります。ユーザー・トレースを調べることにより、データベースに対してどれほどの式が渡されているかを判別できます。
- データベースの関数の中には、ブローカーの関数とわずかに動作が異なるものがあります。
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 文節がメッセージと表の両方を参照する場合、リスト中で表がメッセージよりも先でなければなりません。