2012-01-05 3 views
0

У меня есть расширение функции lib lib для PostgreSQL (v8.4). Библиотека содержит функции Foo() со следующей подписью:Агрегатная функция в PostgreSQL для передачи массива функции C

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

Я хочу передать столбчатых данные для конкретной таблицы в PostGreSQL дб (v 8.4) для функции C, с помощью «совокупной» функции AGG().

Предполагая, что я использую таблицу сотрудников в своем db, со следующими столбцами в таблице сотрудников: id, name, pay.

Я хочу, чтобы передать массив всех зарплат как float8 [] к моей функции C - то есть данные, которые я хочу, чтобы перейти к функции 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) делает именно то, что вы ищете. Должно быть, недоразумение. Ваши примеры неубедительны. –

ответ

1

Во-первых, я не уверен, что для этого нужна функция агрегации U UFF или что вам нужно выбрать массив? Почему нет выделенной суммы (зарплаты), ... работать?

Помните, что каждый раз, когда вы включаете функцию выбора в массив, PostgreSQL выполняет последовательное сканирование таблицы для каждого массива.

Смежные вопросы