我有一个名为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函数,我宁愿找到一种方法将我的数组应用于查询中的现有函数。
答案 0 :(得分:1)
您不需要使用子查询。只是做:
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;
参见示例here。
答案 1 :(得分:1)
您可以使用函数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
获取列中的结果行(而不是带有元组的单个列)。