【问题标题】:use concat function postgresql使用 concat 函数 postgresql
【发布时间】:2020-09-24 12:57:05
【问题描述】:

我想运行这段代码,但遇到了这个错误

提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。

execute $$SELECT MAX(date) FROM $$||table_name INTO datum;
IF datum is not NULL THEN

      execute $$DELETE FROM $$||table_name||$$ WHERE date >= $$||quote_literal(datum);
ELSE
      datum := $$2001-01-01$$;
end if;
execute $$
INSERT INTO $$||table_name||$$
(number, date, departement, minutes)
 select
     number, gs.date,

哪里 (beg, enddate) 重叠 (concat($$||quote_literal(datum)||$$, '00:00:00'), concat($$||quote_literal(datum)||$$, '23:59:59'))

我们还要注意 哪里 (beg, enddate) 重叠 (concat($$||quote_literal(datum)||$$, '00:00:00'), concat($$||quote_literal( datum)||$$, '23:59:59')) 只想在 datum != $$2001-01-01$$; (不是第一次迭代)。

谢谢,

【问题讨论】:

  • || 就够了。
  • 请问您是什么意思。? @ceving
  • || 已经是一个连接运算符,用于连接。因此,您不需要另外使用 concat 。在此处阅读更多信息postgresql.org/docs/9.1/functions-string.html
  • datum是什么数据类型?
  • 我看到我在 $$||quote_literal(datum)||$$ '00:00:00' 之前做过这个并且也得到了错误:::::: :: psycopg2.ProgrammingError:在“00:00:00”或附近出现语法错误

标签: sql postgresql plpgsql dynamic-sql


【解决方案1】:

在使用动态 SQL 时,最好使用format() 构造 SQL 并为参数使用占位符,这样您就不需要来回转换值:

execute format('SELECT MAX(date) FROM %I', table_name) 
   INTO datum;

IF datum is not NULL THEN
      execute format('DELETE FROM %I WHERE date >= $1', table_name)
          using datum;
ELSE
   datum := date '2001-01-01'; 
end if;

execute format('
INSERT INTO %I
(number, date, departement, minutes)
select
     number, gs.date,
      (case
            when trim(string) ~ '^ADM[0-9]$'
              or TRIM(string) ~ '^ADM[0-9]$'
       then 'ADMINISTRATION'
      end) as departement,
sum(extract(epoch from (least(s.enddate, gs.date + interval '1 day' -
                           greatest(s.beg, gs.date)
                          )
              ) / 60) as minutes
from smp s 
  cross join lateral generate_series(date_trunc('day', s.beg), date_trunc('day', least(s.enddate, current_date)), interval '1 day') gs(date)
where (beg, enddate) overlaps ($1 + time '00:00:00', $1 + time '23:59:59'))', table_name)
using datum; -- pass the parameter as a proper date

【讨论】:

  • 谢谢,但我收到错误消息说 psycopg2.ProgrammingError: column "datum" 不存在 请注意,datum 是一个变量而不是一个列。 @a_horse_with_no_name
  • @biwia:您的查询使用了datum 列,您告诉我该列的数据类型是date。我只能使用您提供的信息。或者您的意思是从generate_series() 引用date 列?
  • @a_horse_with_name 抱歉,我这样创建是我的错。抱歉,我不清楚execute $$SELECT MIN(sign_in_date) FROM $$||table_name INTO datum;
  • 所以这是更大的 PL/pgSQL 函数的一部分?那么请edit您的问题并向我们展示完整的功能。一开始,整个查询对我来说并没有什么意义。以及为什么 $$ 引用 select 也没有任何意义
  • 谢谢您,帖子已编辑。请看看@a_horse_with_no_name
猜你喜欢
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 2011-12-31
  • 2022-01-27
  • 1970-01-01
相关资源
最近更新 更多