このトピックでは、SELECT 関数、および他の列関数を使用して、メッセージ・ツリーの反復フィールドを操作することについて説明します。
その合計注文数が、ある一定の量を超える invoice (送り状) に対して特別なアクションを実行するとします。Invoice フィールドの合計注文数を算出するには、メッセージ中の Items すべての Price フィールドを Quantity フィールドで乗算し、その結果を合計する必要があります。これを、次のように SELECT 式を使用して行うことができます。
( SELECT SUM( CAST(I.Price AS DECIMAL) * CAST(I.Quantity AS INTEGER) ) FROM Body.Invoice.Purchases."Item"[] AS I )
この例では、Price および Quantity フィールドのストリング値を適切なデータ・タイプにキャストするために、CAST 式を使用する必要があると想定しています。Price フィールドを decimal (10 進数) にキャストすると、自然な 位取りと精度、つまり、数を表すために必要な位取りと精度を持つ 10 進数値が生成されます。これらの CAST は、データがすでに適切なデータ・タイプの場合には、必ずしも必要とは限りません。
SELECT 式は比較述部に対しても同じように機能し、また標準データベース SQL の SELECT とまったく同じように機能します。FROM 文節は、反復対象を指定し (この場合は、Invoice 内のすべての Item フィールド)、また Item の現行のインスタンスを I を使用して参照できるように設定します。この SELECT の形式には列関数も関係しており (この場合は SUM 関数)、そのため、Invoice 内の Item フィールドごとの、SUM 関数内の式の評価結果をすべて加算することによって SELECT は評価されます。標準 SQL と同じように、NULL 値は列関数によって無視されます。ただし、以下で説明する COUNT 列関数は例外です。結合する非 NULL 値が存在しない場合のみ、列関数によって NULL 値が戻されます。
その他にも、MAX、MIN、および COUNT などの列関数が提供されています。COUNT 関数には、NULL に関して機能の仕方が異なる 2 つの形式があります。最初の形式は、上記の SUM 関数と非常に類似しています。例えば、次のようになります。
SELECT COUNT(I.Quantity) FROM Body.Invoice.Purchases."Item"[] AS I
この式は、Quantity フィールドが NULL 以外になっている Item フィールドの個数を戻します。つまり、COUNT 関数は、SUM 関数が非 NULL 値を加算するのと同じ方法で非 NULL 値をカウントします。COUNT 関数には、次のような別の使い方もあります。
SELECT COUNT(*) FROM Body.Invoice.Purchases."Item"[] AS I
COUNT(*) を使用すると、フィールドが NULL かどうかに関係なく、Item フィールドの合計数をカウントします。上記の例は実際には、次の CARDINALITY 関数の使用と同等です。
CARDINALITY(Body.Invoice.Purchases."Item"[]
標準 SQL の場合と同じように、ここで挙げたすべての SELECT の例でも、WHERE 文節を使用してフィールドのフィルター操作を行うことができます。