首页 > 解决方案 > 尽管函数定义中有 RETURN 语句,但 Postgres 查询没有结果数据的目的地

问题描述

我创建了一个生成 HH:MM 时间戳并将其保存为函数的代码。但是当我尝试调用它时SELECT random_timestamp();返回错误-> 查询没有结果数据的目的地

CREATE OR REPLACE FUNCTION random_timestamp() 
RETURNS text AS 
'
BEGIN
SELECT
         CASE
                WHEN Length(s1.hours) = 1
                AND    Length(s1.minutes) = 1 THEN Concat(''0'',s1.hours, '':'',''0'', s1.minutes)
                WHEN Length(s1.hours) = 1
                AND    Length(s1.minutes) = 2 THEN Concat(''0'',s1.hours, '':'', s1.minutes)
                WHEN Length(s1.hours) = 2
                AND    Length(s1.minutes) = 1 THEN Concat(s1.hours, '':'', ''0'', s1.minutes)
                ELSE Concat(s1.hours, '':'', s1.minutes)
         END
  FROM   (SELECT floor(Random() * (23-0-1) + 0)::text AS hours ,
                 floor(random() * (59-0-1) + 0)::text AS minutes) AS s1;
RETURN(SELECT random_timestamp());
END;
' 
language 'plpgsql';

标签: sqlpostgresqlfunction

解决方案


您实际上并不需要 PL/pgSQL。一个简单的 SQL 函数就可以了:

CREATE OR REPLACE FUNCTION random_timestamp() 
RETURNS text
LANGUAGE sql
AS 
$function$
  SELECT
  CASE
      WHEN Length(s1.hours) = 1
      AND    Length(s1.minutes) = 1 THEN Concat('0',s1.hours, ':','0', s1.minutes)
      WHEN Length(s1.hours) = 1
      AND    Length(s1.minutes) = 2 THEN Concat('0',s1.hours, ':', s1.minutes)
      WHEN Length(s1.hours) = 2
      AND    Length(s1.minutes) = 1 THEN Concat(s1.hours, ':', '0', s1.minutes)
      ELSE Concat(s1.hours, ':', s1.minutes)
  end
  FROM   (SELECT floor(Random() * (23-0-1) + 0)::text AS hours ,
       floor(random() * (59-0-1) + 0)::text AS minutes) AS s1;
$function$
;

但是你把这个复杂化了。如果要生成随机时间值,可以使用:

select time '00:00' + make_interval(mins => (random() * 1440)::int)

如果需要,您可以将其放入函数中:

create or replace function random_time()
   returns time
as
$$
  select time '00:00' + make_interval(mins => (random() * 1440)::int);
$$
language sql;

如果你真的需要一个text值,你可以使用to_char()

select to_char(random_time(), 'hh24:mi')

你的


推荐阅读