#postgresql
#postgresql
Вопрос:
У меня есть функция в postgresql, которая возвращает запрос на основе предоставленных входных данных:
create or replace function func(last_month date, arg1 varchar default 'any')
returns table(id bigint, start_date date, end_date date) as $$
begin
if arg1 = 'multiple' then
SELECT DISTINCT id, (last_month - interval '1 year' interval '1 month')::date as start_date,
last_month as end_date
FROM table
WHERE month BETWEEN (last_month - interval '1 year' interval '1 month')::date
AND last_month
and month >= '2017-09-01'
AND activity >= 5;
else
SELECT DISTINCT id, (last_month - interval '1 year' interval '1 month')::date as start_date,
last_month as end_date
FROM table
WHERE month BETWEEN (last_month - interval '1 year' interval '1 month')::date
AND last_month
and month >= '2017-09-01'
end if;
end; $$ language sql;
Однако, когда я его запускаю, он выдает следующую ошибку :
syntax error at or near "if"
Я проверил возврат только целого числа для целей тестирования, и он работает, и синтаксис кажется нормальным. Как я могу вернуть разные результаты запроса из функции на основе заданных входных данных.
Комментарии:
1.
IF
В SQL нет, если вы хотите что-то подобное, вам нужно использовать PL / pgSQL (где вместо этого вам понадобится ЗАПРОС ВОЗВРАТА)2. Я попытался вернуть запрос следующим образом: если device_type = ‘computer’, то возвращаемый запрос ВЫБИРАЕТ DISTINCT panelist_id, (last_month — интервал ‘1 год’ интервал ‘1 месяц’)::date как start_date, last_month как end_date ИЗ mdb.smart_validation, ГДЕ месяц МЕЖДУ (last_month — интервал ‘1 год’ интервал ‘1 месяц’)::дата И last_month и месяц> = ‘2017-09-01’ — первый день данных в P2 И steady — TRUE, А underage — false И pc_activity > = 5; end if; но, похоже, не работает.
Ответ №1:
Я смог решить его следующим образом:
create or replace function func(last_month date, arg1 varchar default 'any')
returns table(id bigint, start_date date, end_date date) as $BODY$
begin
case arg1
when arg1 = 'multiple' then
return query
SELECT DISTINCT id, (last_month - interval '1 year' interval '1 month')::date as start_date,
last_month as end_date
FROM table
WHERE month BETWEEN (last_month - interval '1 year' interval '1 month')::date
AND last_month
and month >= '2017-09-01'
AND activity >= 5;
else
return query
SELECT DISTINCT id, (last_month - interval '1 year' interval '1 month')::date as start_date,
last_month as end_date
FROM table
WHERE month BETWEEN (last_month - interval '1 year' interval '1 month')::date
AND last_month
and month >= '2017-09-01';
end case;
end;
$BODY$ language plpgsql;