Malodar
@Malodar
Начинающий питонист

Как создать табличную функцию PostgreSQL c названиями колонок в качестве аргументов?

Добрый день всем.
Есть команда
select supplier, car_category, count(car_type) from mytable group by 1,2 order by 1,2;

, которая возвращает требуемую мне таблицу
supplier | car_category | count
----------+--------------+-------
Avis | Compact | 4
Avis | Fullsize | 2
Avis | Hatch | 6
Avis | Intermediate | 4
Avis | Sedan | 6
Avis | Standard | 2
Avis | SUV | 6
Budget | Compact | 8
Budget | Fullsize | 4
Budget | hatch | 2
Budget | Hatch | 2
Budget | Hatchback | 4
Budget | Intermediate | 8
Budget | Sedan | 4
Budget | Standard | 4
Europcar | Compact | 5
Europcar | Fullsize | 5
Europcar | Intermediate | 15
Europcar | Standard | 10
(19 rows)

Задача - написать функцию, которая бы возвращала то же самое. Моя попытка:
create or replace function pivot_car_type(a text, b text, c text)
returns table(supplier text, category text, car_type_qty bigint) as
$$
begin
return query
select a,b,count(c) from avis.rateshop group by 1,2 order by 1,2;
end;
$$
language 'plpgsql';


Но при вызове
select * from pivot_car_type(supplier, car_category, car_type);

получаю ответ вида:
supplier | category | car_type_qty
----------+--------------+--------------
supplier | car_category | 101
(1 row)
где 101 - это количество записей в таблице.
Т.е. получается, что функция использует команду вида:
select 'supplier', 'car_category', count('car_type') from mytable group by 1,2 order by 1,2;

а не
select supplier, car_category, count(car_type) from mytable group by 1,2 order by 1,2;

Подскажите, что я делаю не так, пожалуйста :)
  • Вопрос задан
  • 38 просмотров
Пригласить эксперта
Ответы на вопрос 1
Melkij
@Melkij
PostgreSQL DBA
Так и должно быть.

Если хотите строить запрос динамически - то и стройте его динамически в переменной, затем отправляйте на исполнение.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы