Агрегатная функция в PostgreSQL для передачи массива в функцию C - PullRequest
0 голосов
/ 05 января 2012

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

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

Я хочу передать столбчатые данные для конкретной таблицы в postgresql db (v 8.4) в функцию C, используя функцию агрегирования agg ().

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

Я хочу передать массив всех зарплат как float8 [] в мою функцию C - то есть данные, которые я хочу передать в функцию C, - это те данные, которые выводятся на консоль, когда я набираю выберите зарплату у сотрудников

Я обнаружил функцию array_agg () и подумал, что мог бы использовать ее для возврата float8 [] в мою функцию C (через адаптер), чтобы я мог выполнить инструкцию вроде:

select foo(array_agg(salary)) from employees;

однако, когда я попробовал это, я понял, что получаю неправильные результаты.

Затем я запустил SELECT array_agg (wages) от сотрудников и был удивлен, обнаружив, что вместо простого массива чисел на консоль было выведено множество пустых строк - вместе с тем, во что «сжалась» целая куча чисел один массив к концу распечатки. Нет необходимости говорить, что данные в таблице (столбец зарплаты) не принимают значения NULL, поэтому я не понимаю, что array_agg () возвращает на экран.

То, что мне нужно найти, - это способ создания функции (агрегатной или другой), которая возвращает данные, эквивалентные «select [columnname] from tablename» в качестве массива с плавающей точкой.

Я провел большую часть дня в Интернете, просматривая документацию postgres, и пока не нашел полезного примера создания пользовательских агрегатных функций или чего-либо удаленно полезного для решения этой проблемы.

Буду признателен за любую помощь в написании функции, которая возвращает значения в столбце (таблицы или запроса), чтобы я передал эти значения в функцию C.

1 Ответ

1 голос
/ 21 августа 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...