スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PL/pgSQLで引数の総和と平均を求める

以前書いたPL/pgSQLで可変長引数の改訂版です。
引数の合計の関数ができたので、それを再利用して平均を求める関数を作ろうと思ったら可変長引数の関数に、配列は渡せないんですね。
ということで、配列を引数にする関数をベースにして、それを呼ぶ合計と平均の関数を書くことにします。
■配列の合計を求める。

CREATE OR REPLACE FUNCTION uv_sum_ary(
p_ary numeric[]
) RETURNS numeric AS $$
DECLARE
w_result numeric := 0;
BEGIN
FOR i IN 1..array_length(p_ary, 1) LOOP
IF p_ary[i] IS NOT NULL THEN
w_result := w_result + p_ary[i];
END IF;
END LOOP;
RETURN w_result;
END;
$$ LANGUAGE plpgsql;

実は以前の関数では、引数の中にNULLが入ってくるのを考慮するのを忘れていました。
演算の中に一つでもNULLが入ると、結果がNULLになってしまいます。
SELECT 1 + 2 + 3 + 4 + NULL + 5 + 6 + 7 + 8 + 9;
の結果はNULLなんですよ。
ということで、NULLチェックをしています。
また以前は引数をintにしていましたが、整数以外にも少数もつかえるようにしたかったので、numeric型にしました。
最後にベースの関数を利用して、可変長引数な合計と平均を作ります。
■引数の合計を求める

CREATE OR REPLACE FUNCTION uv_sum(
p_params VARIADIC numeric[]
) RETURNS numeric AS $$
DECLARE
BEGIN
RETURN uv_sum_ary(p_params);
END;
$$ LANGUAGE plpgsql;

■引数の平均を求める

CREATE OR REPLACE FUNCTION uv_avg(
p_params VARIADIC numeric[]
) RETURNS numeric AS $$
DECLARE
BEGIN
RETURN uv_sum_ary(p_params) / array_length(p_params, 1);
END;
$$ LANGUAGE plpgsql;


追記 2009/10/09
訂正記事 PL/pgSQLで引数の総和と平均を求めるVer2
スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。