我有一个用于PostgreSQL(v8.4)的C函数扩展库。该库包含一个带有以下签名的函数foo():
double foo(const double* values, const size_t len);
我想通过使用“聚合”函数agg()将postgresql db(v 8.4)中特定表的列数据传递给C函数。
假设我在我的数据库中使用employees表,并在employees表中使用以下列:id,name,salary。
我想将所有工资的数组作为float8 []传递给我的C函数 - 即我要传递给C函数的数据是当我输入时打印到控制台的数据 从员工中选择薪水
我发现了array_agg()函数,并认为我可以使用它将float8 []返回到我的C函数(通过适配器),这样我就可以执行如下语句:
select foo(array_agg(salary)) from employees;
然而,当我尝试这个时,我意识到我的结果不正确。
然后我从员工那里运行SELECT array_agg(工资)并且很惊讶地发现,不是一个简单的数字数组,而是在控制台上打印了很多空行 - 以及一大堆数字“挤进”了打印输出结束时的一个数组。不用说,表中的数据(工资列)不接受NULL值,所以我不明白array_agg()返回到屏幕是什么。
我需要找到的是一种创建返回函数(聚合或其他)的方法 数据等同于“从tablename中选择[columnname]”作为浮点数组。
我花了大部分时间在线搜索和postgres文档 - 我还没有找到一个有用的例子来创建用户定义的聚合函数或任何远程有用的东西来帮助解决这个问题。
在编写一个返回列(表或查询)中的值的函数时,我将不胜感激,以便将这些值传递给C函数。
答案 0 :(得分:1)
首先,我不确定这需要C UDF聚合函数还是您需要选择一个数组?为什么不选择总和(工资),......工作?
记住每次在数组中包含select函数时,PostgreSQL会对每个数组执行顺序表扫描。