2012-01-05 154 views
0

我有PostgreSQL(v8.4)的C函數擴展libray。該庫包含一個函數foo()具有以下簽名:PostgreSQL中的聚合函數將數組傳遞給C函數

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

我想通過柱狀數據以在一個PostgreSQL分貝的特定表(V 8.4)的C功能,通過使用一個「聚合」的功能AGG()。

假設我在我的數據庫中使用employees表,並在employees表中包含以下列:id,name,salary。

我想通過所有的工資的陣列作爲我的C函數的float8 [] - 即數據我想傳遞給C函數是其上打印到控制檯當我輸入 選擇從員工

工資,我發現了ARRAY_AGG()函數,並認爲我可以用它來一個是float8 []回到我的C函數(通過轉接器),這樣我就可以執行類似的語句:

select foo(array_agg(salary)) from employees; 

但是,當我嘗試這個,我意識到我得到不正確的結果。

然後,我從員工那裏運行SELECT array_agg(工資),驚訝地發現,而不是一個簡單的數字數組,大量的空白行被打印到控制檯 - 以及一大堆數字「擠」進入一個陣列,直至打印結束。不用說,表中的數據(工資欄)不接受NULL值,所以我不明白array_agg()返回到屏幕。

我需要找到的是一種創建函數(聚合或其他)的方法,該函數返回 等價於「select [columnname] from tablename」的數據作爲浮點數組。

我花了大部分時間在網上搜索和postgres文檔 - 我還沒有找到一個有用的例子來創建用戶定義的聚合函數或任何遠程有用的幫助解決這個問題。

我非常感謝編寫一個返回列(表或查詢)中的值的函數,以便將這些值傳遞給C函數。

+1

['array_agg()'](http://www.postgresql.org/docs/current/interactive/functions-aggregate.html)完全符合您的要求。必須有一個誤解。你的例子沒有定論。 – 2012-01-05 04:21:44

回答

1

首先我不確定這需要C UDF聚合函數還是需要選擇一個數組?爲什麼不選擇總和(薪水),...工作?

記住每次將選擇函數包含到數組中時PostgreSQL會爲每個數組執行順序表掃描。