- カテゴリ:
半構造化データ関数と構造化データ関数 (高次)
REDUCE¶
ラムダ式のロジックに基づいて、 配列 を単一の値に減らします。
REDUCE 関数は、配列、アキュムレータの初期値、ラムダ関数を受け取ります。配列の各要素にラムダ関数を適用し、各結果でアキュムレータを更新します。すべての要素を処理した後、 REDUCE は最終的なアキュムレータ値を返します。
- こちらもご参照ください。
構文¶
引数¶
array削除される要素を含む配列。配列は半構造化でも構造化でもかまいません。
initアキュムレータの初期値。
lambda_expression各配列要素の削除ロジックを定義する ラムダ式。
ラムダ式は以下の構文で指定する必要があります。
acc引数はアキュムレータであり、value引数は配列内で現在処理されている要素です。
戻り値¶
この関数は、任意のデータ型の値を返すことができます。
入力配列が空の場合、この関数はアキュムレータの初期値を返します。
これらの場合、関数は NULL を返します。
入力配列は NULL です。
アキュムレータの初期値は NULL です。
ラムダ関数は NULL を返します。
使用上の注意¶
ラムダ
value引数のデータ型が明示的に指定されている場合、配列要素はラムダ呼び出しの前に指定された型に強制されます。強制については、 データ型の変換 をご参照ください。型チェックは、アキュムレータの初期値、アキュムレータのラムダ引数、およびラムダ実行の戻り値がすべて同じ論理型および物理型であることを強制します。この要件を満たすために キャスティング を使用する場合、3つのうち最大の物理的型が使用されます。
引数
valueには、中間 NULL 値が指定されます。例については、 配列内の NULL 値のスキップ をご参照ください。
例¶
以下の例では、 REDUCE 関数を使用しています。
配列内の合計値の計算¶
REDUCE 関数を使用して、配列の値の合計を返し、アキュムレータの初期値に 0 を指定します。
この例は前の例と同じですが、この例では INT 型の構造化配列を指定しています。
REDUCE 関数を使用して、配列の値の合計を返し、アキュムレータの初期値に 10 を指定します。
配列内の各値の2乗の合計の計算¶
REDUCE 関数を使用して、配列の各値の2乗和を返し、アキュムレータの初期値に 0 を指定します。
配列内の NULL 値のスキップ¶
この例では、 array 引数に NULL 値が含まれています。この配列を REDUCE 関数に渡すと、アキュムレータには中間 NULL 値が指定されます。
REDUCE 関数を使用して配列内の値の合計を返し、配列内の NULL 値をスキップするためにラムダ式のロジックで ZEROIFNULL 関数を使用します。ラムダ式は ZEROIFNULL 関数を使用して、以下のロジックで配列の各値を処理します。
valが NULL の場合、ラムダ式の結果はacc + 0となります。valが NULL でない場合、ラムダ式の結果はacc + valとなります。
クエリを実行します。
文字列値の生成¶
REDUCE 関数を使用して、配列内の各値を連結して文字列値のリストを返します。
アキュムレーターでの配列の使用¶
ラムダ式のロジックで ARRAY_PREPEND 関数とともに REDUCE 関数を使用すると、入力配列の順序を逆にした配列を返します。
条件付きロジックの使用¶
ラムダ式のロジックで IFF 関数とともに REDUCE 関数を使用し、 if-then 式と同様の条件ロジックに基づいてアクションを実行します。この例では、ラムダ式に以下のロジックを使用しています。
配列の値が7より小さい場合、2乗してアキュムレータに追加します。
配列の値が7以上である場合、2乗せずにアキュムレータに追加します。
テーブル内の要素の配列を単一値にする¶
order_id、 order_date、 order_detail の列を持つ orders という名前のテーブルがあるとします。order_detail 列は、行項目、購入数量、小計の配列です。テーブルには2行のデータがあります。次の SQL ステートメントは、このテーブルを作成し、行を挿入します。
REDUCE 関数を使用して、各注文の全商品の小計を返します。
REDUCE 関数を使用して、各注文で販売された商品のリストを返します。
Lambda式でテーブルの列を参照し、テーブルデータの配列要素を減らす¶
ARRAY型の列と INT型の列を持つテーブルを作成します。
REDUCE関数を使用して、 col2 の値をアキュムレーターの値に加算して、各行の配列の値の合計を返します。