SELECT 関数は、複合メッセージおよびデータベース・データを結合し、フィルターに掛け、変換します。
(1) >>-------SELECT--SelectClause--FromClause--+-------------+----->< '-WhereClause-' WHERE .-<<---- ,------ <<--------. V | |--SelectClause = --+---Expression--+----------+-+----+---------| | +-AS--Path-+ | | '-INSERT---' | +-ITEM--Expression----------------+ | (2) | '-+-COUNT-----+--(--Expression--)-' +-MAX-------+ +-MIN-------+ '-SUM-------' |--FromClause = --FROM------------------------------------------> .-<<---- ,------ <<-----------------------. V | >----FieldReference--+---------------------+-+------------------| '-AS--CorrelationName-' |--WhereClause = --WHERE--Expression----------------------------|
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.XMLNS.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 選択を参照)。