このトピックでは、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 文節を使用してフィールドのフィルター操作を行うことができます。