Интеграция результирующих столбцов из функции в основной запрос - PullRequest
0 голосов
/ 11 мая 2018

Я создал функцию, которая возвращает таблицу с одной строкой и тремя столбцами.

DROP FUNCTION IF EXISTS get_event_deposit_values(INTEGER, date, date);
CREATE OR REPLACE FUNCTION get_event_deposit_values(event_id INTEGER, start_date date, end_date date)
RETURNS TABLE (carried_over INTEGER, current_month INTEGER, deposit INTEGER)
AS $$
DECLARE status INTEGER;
BEGIN
    carried_over := 0;
    current_month := 0;
    deposit := 0;

    RETURN QUERY
    SELECT carried_over, current_month, deposit;
END
$$ LANGUAGE plpgsql;

Запустите простой запрос в pgAdmin.
select * FROM get_event_deposit_values(20170913, '1999/01/01', '2018/05/11');
Возвращает три столбца с одной строкой.

Затем выполните запрос в сочетании с основным запросом (увидел его на веб-сайте).
select t.id from t_events AS t, lateral get_event_deposit_values(t.id, '1999/01/01', '2018/05/11') where id = 20170913;

Ошибка произошла около get_event_deposit_values(t.id. PostgreSQL, который я использую, имеет версию 8.3, которая довольно устарела. Есть ли альтернативный способ сделать это?

1 Ответ

0 голосов
/ 12 мая 2018

Документация о боковых подзапросах (в первой версии, которая поддерживает это, а именно 9.3, если я не упустил из виду), заявляет, что по умолчанию для табличных функций было боковое, даже безключевое словоТак что может быть небольшая вероятность, что это также имеет место в вашей версии.

Так что попробуйте, что произойдет, если вы просто удалите ключевое слово LATERAL.

Если это не сработает(что я ожидаю) вы можете выбрать каждый из различных столбцов функции в подзапросе в списке столбцов в качестве обходного пути.

SELECT t.id,
       (SELECT carried_over
               FROM get_event_deposit_values(t.id, '1999/01/01', '2018/05/11')) carried_over,
       (SELECT current_month
               FROM get_event_deposit_values(t.id, '1999/01/01', '2018/05/11')) current_month,
       (SELECT deposit
               FROM get_event_deposit_values(t.id, '1999/01/01', '2018/05/11')) deposit
       FROM t_events t
       WHERE t.id = 20170913;

(И, возможно, рассмотрите возможность обновления до более поздней версии.)

...