применить функцию postgres к массиву без гнезда - PullRequest
0 голосов
/ 28 апреля 2018

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

CREATE OR REPLACE FUNCTION recntrek.site_opened_on_date(
site_id bigint,
in_date date DEFAULT (
now(
))::date)
RETURNS SETOF "TABLE(date date, opening_time time without time zone, closing_time time without time zone)"
LANGUAGE 'plpgsql'
COST 5.0
STABLE 
ROWS 3.0
AS $function$

Я хочу применить эту функцию на 7 дней. Я пробовал это:

SELECT (
SELECT t FROM site_opened_on_date(100520000101526, _d) t
)FROM unnest(ARRAY[ now(),
 now()+ INTERVAL '1 DAY',
 now()+ INTERVAL '2 DAY',
 now()+ INTERVAL '3 DAY',
 now()+ INTERVAL '4 DAY',
 now()+ INTERVAL '5 DAY',
 now()+ INTERVAL '6 DAY'
]::DATE[])  _d;

Но я получаю следующую ошибку: более одной строки, возвращенной подзапросом, используемым в качестве выражения Это связано с тем, что функция site_opened_on_date может возвращать более одной строки за дату. У кого-нибудь есть идея решения? Я бы не стал писать новую функцию postgres, я бы предпочел найти способ применения моего массива к существующей функции в запросе.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Вы можете легко создать серию последовательных дат с помощью функции generate_series(start, stop, step interval):

SELECT t.*
FROM generate_series(now(), now()+ '6 days', '1 day') as _d
CROSS JOIN LATERAL site_opened_on_date(100520000101526, _d::date) t

или

SELECT (site_opened_on_date(100520000101526, _d::date)).*
FROM generate_series(now(), now()+ '6 days', '1 day') as _d

Использование

SELECT t.* 

вместо

SELECT t

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

0 голосов
/ 29 апреля 2018

Вам не нужно использовать подзапрос. Просто сделай:

SELECT
    (recntrek.site_opened_on_date(100520000101526, _d)).*
FROM
    unnest( ARRAY[
            now(),
            now()+ INTERVAL '1 DAY',
            now()+ INTERVAL '2 DAY',
            now()+ INTERVAL '3 DAY',
            now()+ INTERVAL '4 DAY',
            now()+ INTERVAL '5 DAY',
            now()+ INTERVAL '6 DAY'
        ]::DATE[]) _d;

См. Пример здесь .

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