2012-01-05 217 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会为每个数组执行顺序表扫描。