2012-01-05 9 views
0

私はPostgreSQL(v8.4)用のC関数拡張ライブラリを持っています。ライブラリには、次のシグネチャを持つ関数foo()が含まれています配列をC関数に渡すPostgreSQLの集約関数

double foo(const double* values, const size_t len); 

私は「集計」機能を使用することにより、C関数にPostgreSQLのDB(V 8.4)で特定のテーブルのための柱状のデータを渡したいですagg()。

私は、私のデータベース内のemployeesテーブルを、employeesテーブルの次のカラム、すなわちid、name、salaryを使用していると仮定します。

すべての給与の配列をCの関数にfloat8 []として渡したいと思います。つまり、C関数に渡すデータは、入力時にコンソールに出力されるデータです。 select従業員

から給料私はARRAY_AGG()関数を発見し、私はのようなステートメントを実行することができるように、私は、(アダプタ経由)私のC関数に[] float8型を返すためにそれを使用することができることを考えた:

select foo(array_agg(salary)) from employees; 

しかし、私がこれを試したときに、私は間違った結果を得ていることに気付きました。

従業員からSELECT array_agg(賃金)を実行して、単純な配列の代わりに、たくさんの空白行がコンソールに表示され、プリントアウトの終わりに向かって1つの配列に移動します。言うまでもなく、表のデータ(給与列)はNULL値を受け入れないため、array_agg()が画面に戻っているものはわかりません。

浮動小数点数の配列として「tablenameから[columnname]を選択する」と同等のデータを返す関数(集計など)を作成する方法です。

私はほとんどの時間オンラインとPostgresのドキュメントを検索するのに費やしてきました。ユーザー定義の集計関数やこの問題を解決するのに役立つ便利なものはまだありません。

(テーブルやクエリの)列の値を返す関数を書くことに助力があれば、これらの値をC関数に渡すことに感謝します。

+1

['array_agg()'](http://www.postgresql.org/docs/current/interactive/functions-aggregate.html)は、探しているものとまったく同じです。誤解があるはずです。あなたの例は決定的ではありません。 –

答えて

1

まず、C UDF集計関数が必要か、配列に選択する必要があるかどうかわかりませんか?なぜ選択合計(給与)、...働かないのですか?

select関数を配列に含めるたびに、PostgreSQLは配列ごとに順次テーブルスキャンを行います。