【问题标题】:Format interval date type as a parameter in PostgreSQL function格式化间隔日期类型作为 PostgreSQL 函数中的参数
【发布时间】:2022-01-18 12:06:49
【问题描述】:

在 PostgreSQL 函数中参数化间隔日期类型的最佳方法是什么?我有以下功能

CREATE OR REPLACE FUNCTION testing(
min_time integer
) 
RETURNS void AS
$BODY$
BEGIN
 EXECUTE format('CREATE TABLE foo AS
 SELECT
     gid,
     now() + concat(%s, ' hours')::interval as x,

  FROM foobar
  limit 3  ',min_time  );

 END;
$BODY$
LANGUAGE plpgsql;

每次我尝试执行该函数时,我都会收到以下错误ERROR: syntax error at or near "hours"

【问题讨论】:

  • 您没有正确嵌套字符串。嵌入在字符串常量中的单引号需要通过加倍来转义。 concat(%s, '' hours'')::interval - 但使用 make_interval() 可能会容易得多
  • 为什么要使用动态 SQL?在这种情况下,这似乎毫无意义
  • 这只是一个虚拟示例。我有使用动态 SQL 的用例,因为我需要在不同的上下文中使用它

标签: sql postgresql postgresql-14


【解决方案1】:

单引号必须在字符串中转义:

CREATE OR REPLACE FUNCTION testing(min_time integer) RETURNS void
   LANGUAGE plpgsql AS
$BODY$
BEGIN
   EXECUTE format(
              'CREATE TABLE foo AS
               SELECT gid,
                      now() + ''%s hours''::interval as x
               FROM foobar
               limit 3',
              min_time
           );
END;
$BODY$;

但实际上,您不需要动态 SQL,静态 SQL 可能是更好的选择:

CREATE OR REPLACE FUNCTION testing(min_time integer) RETURNS void
   LANGUAGE plpgsql AS
$BODY$
BEGIN
   CREATE TABLE foo (
      gid bigint NOT NULL,
      x timestamp with time zone NOT NULL
   );

   INSERT INTO foo
   SELECT gid,
          now() + min_time * '1 hour'::interval
   FROM foobar
   limit 3;
END;
$BODY$;

【讨论】:

    猜你喜欢
    • 2018-10-30
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2017-07-03
    • 2018-03-16
    相关资源
    最近更新 更多