我有一个称为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;
请参见此处的示例。