在不需要的情况下在数组上应用postgres函数

时间:2018-04-28 19:58:54

标签: postgresql

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

2 个答案:

答案 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

获取列中的结果行(而不是带有元组的单个列)。