возвращает запрос из функции psql на основе аргументов функции

#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;