SELECT 関数は、複合メッセージおよびデータベース・データを結合し、フィルターに掛け、変換します。
SELECT 関数の戻り値は、通常は別のメッセージ・ツリーで、SelectClause によって構造と内容が判別される "row" が含まれます。結果の行数は、FROM 文節中のすべてのフィールド参照と表参照によって指されているすべての "row" のうち、WHERE 文節によってフィルタリングされたものの合計になります。つまり、WHERE 文節が TRUE に評価されるフィールドのみ含まれます。
SELECT 関数の戻り値をスカラーにすることもできます (ITEM 選択を参照)。
通常、SelectClause 式と WHERE 文節式は両方とも相関変数を使用して "column" 値 (つまり、入力メッセージ・ツリー中のフィールド) にアクセスするので、入力メッセージからのデータを含む新しいメッセージ・ツリーが構築されます。相関変数は AS CorrelationName 文節で指定された名前により参照されるか、または AS 文節が指定されていない場合は、FROM FieldReference 中の最後の名前 (つまり、最後のドットの後の名前) によって参照されます。
フィールド参照が実際には TableReference の場合、操作は非常に似たものになります。この場合、入力は実際のデータベース表になるので、データベースによってサポートされるフラットな構造に制限されます。しかし、結果のツリーには依然として制限はありません。
FROM 文節中に複数のフィールド参照がある場合は、右端の参照は個々の行を右端から 2 番目の参照の行ごとにステップスルーし、以後同様になります。したがって、結果の行の総数は、個々の表の行数の積になります。この種の選択のことを結合 といい、普通は結果からこれらの行のほとんどを除外する WHERE 文節が使用されます。結合は、普通はデータベースのデータをメッセージに追加するために使用されます。
以下の例は、データベース "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 文節は AS 文節の代わりになります。この文節は、SelectClause 式の結果 (行でなければならない) を、現在の新しい行の子ではなくその行自体に割り当てます。そのため、式の結果の行が、SELECT によって生成される行にマージされます。AS 文節はこの点で異なります。AS 文節は常に結果を追加する前に 1 つ以上の子エレメントを生成しますが、INSERT は生成しません。他の SELECT 操作からのデータを挿入する際には INSERT が便利です。なぜなら、フォルダーを追加せずにデータをマージできるからです。
SelectClause を、式上で動作する関数 COUNT、MAX、MIN、および SUM のいずれかで構成できます。これらの関数のことを列関数といいます。それは 1 つのスカラー値 (リストではない) を戻し、FROM 文節の行をステップスルーして Expression が評価したカウント、最大、最小、または合計の値が示されます。Expression が特定の行を NULL に評価すると、その値は無視されるので、この関数は残りの行のカウント、最大、最小、または合計を戻します。
COUNT 関数に限り、Expression を 1 つの星印 (*) で構成できます。この形式の場合、ヌル値かどうかにかかわらず行をカウントします。
結果に入力メッセージを適切に反映させるには、通常は Expression に相関変数を組み込みます。
通常、Expression は行ごとに同じデータ・タイプに評価します。これらの場合、MAX、MIN、および SUM 関数の結果は、オペランドと同じデータ・タイプになります。しかし、戻り値はすべて同じタイプである必要はなく、同じでない場合は通常の演算の規則が適用されます。例えば、反復メッセージ構造中のフィールドで、ある行の場合は整数値が含まれ、他の行の場合は浮動小数点値であれば、合計は通常の加算の規則に従います。整数値と浮動小数点値を加算することと同等の操作になるので、タイプは浮動小数点になります。
COUNT 関数の結果は常に整数になります。
FROM 式の相関変数がメッセージ中の行を表す場合と、実際のデータベース表の行を表す場合では、動作が多少違います。
メッセージの場合は、星印 (*) を含むパスは通常の意味になります。フィールドの名前を無視し、他の基準と一致する最初のフィールドを (ある場合) 検出します。
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 によって宣言された相関名、および任意の宣言済み変数や定数を参照できます。
FROM 文節 FieldReference には、任意の種類の式を含めることができます (例えば、Database.{DataSource}.{Schema}.Table1)。
実行時にフィールド、データ・ソース、スキーマ、または表の名前を計算できます。
WHERE 文節式はすべてのブローカーの演算子および関数をどのような組み合わせでも使用できます。この式は、表の列、メッセージ・フィールド、および宣言済み変数や定数を参照できます。
しかし、ブローカーは式を検証し、データベースが式全体を評価可能であるかを判別して、WHERE 文節式を扱うことに注意してください。可能である場合、式はデータベースに渡されます。データベースによる評価が可能であるためには、データベースでサポートされる関数と演算子だけを使用しなければなりません。
しかし、WHERE 文節は、メッセージ・フィールド、包含している SELECT によって宣言された相関名、および有効範囲内にある他の宣言済み変数や定数を参照できます。
THE 関数 (リストの最初のエレメントを戻す) を SELECT と併用して、リストでない結果を作成できます。この方法は、例えば SELECT 照会が 1 つ以下の項目を戻す必要がある場合に便利です。特に、ITEM と併用すると便利です (ITEM 選択を参照)。