将Postgres函数应用于无效的阵列



我有一个称为site_opened_on_date的postgres函数,该函数将ID和日期作为输入。该函数的签名如下:

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函数,我希望找到一种将数组应用于查询中现有函数的方法。

您可以轻松地使用函数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

在列中获取产生的行(而不是带有元组的单列(。

您不需要使用子查询。只是做:

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;

请参见此处的示例。