为什么这个函数不是 return 预期的 tsrange[]

why does this function not return the excpected tsrange[]

我有这些table和这个数据集

CREATE TABLE  employee (entity_id uuid, valid tsrange);
INSERT into employee (entity_id, valid)
VALUES
('0006f79d-5af7-4b29-a200-6aef3bb0105f', tsrange('2009-05-23 02:00:00','2010-08-27 02:00:00')),
('0006f79d-5af7-4b29-a200-6aef3bb0105f', tsrange('2010-08-27 02:00:00','2010-10-27 02:00:00')),
('0006f79d-5af7-4b29-a200-6aef3bb0105f', tsrange('2011-05-23 02:00:00','infinity'))

我想 select 每个连续聚合 tsrange,作为 tsrange[],作为特定 entity_id

为此我有这个功能

CREATE OR REPLACE FUNCTION tsrange_cluster_aggregate(_tbl regclass, selected_entity_id uuid)
  RETURNS SETOF TSRANGE AS
$$
BEGIN
EXECUTE
FORMAT(
 'SELECT tsrange(min(COALESCE(lower(valid), ''-infinity'')), max(COALESCE(upper(valid), ''infinity'')))
FROM  (
   SELECT *, count(nextstart > enddate OR NULL) OVER (ORDER BY valid DESC NULLS LAST) AS grp
   FROM  (
      SELECT valid
           , max(COALESCE(upper(valid), ''infinity'')) OVER (ORDER BY valid) AS enddate
           , lead(lower(valid)) OVER (ORDER BY valid) As nextstart
      FROM %1$I
      where entity_id = %2$L
      ) a
   ) b
GROUP  BY grp
ORDER  BY 1;'
, _tbl , selected_entity_id)
USING _tbl, selected_entity_id;
END
$$ LANGUAGE plpgsql;


SELECT tsrange_cluster_aggregate('employee'::regclass, '0006f79d-5af7-4b29-a200-6aef3bb0105f');

这里的问题是这个函数的输出总是空的?

当我在函数外 运行 时得到预期的输出?

https://dbfiddle.uk/?rdbms=postgres_12&fiddle=a09f8033091ea56e533880feebd0d5d4

您的函数中缺少 RETURN

CREATE OR REPLACE FUNCTION tsrange_cluster_aggregate(_tbl regclass, selected_entity_id uuid)
  RETURNS SETOF tsrange[] AS
$$
BEGIN
RETURN QUERY EXECUTE
FORMAT(
 ' SELECT array_agg(j) FROM (
SELECT tsrange(min(COALESCE(lower(valid), ''-infinity'')), max(COALESCE(upper(valid), ''infinity'')))
FROM  (
   SELECT *, count(nextstart > enddate OR NULL) OVER (ORDER BY valid DESC NULLS LAST) AS grp
   FROM  (
      SELECT valid
           , max(COALESCE(upper(valid), ''infinity'')) OVER (ORDER BY valid) AS enddate
           , lead(lower(valid)) OVER (ORDER BY valid) As nextstart
      FROM %1$I
      where entity_id = %2$L
      ) a
   ) b
GROUP  BY grp
ORDER  BY 1) z (j);'
, _tbl , selected_entity_id)
USING _tbl, selected_entity_id;
END
$$ LANGUAGE plpgsql;

演示:db<>fiddle