【问题标题】:postgresql array_length to int variablepostgresql array_length 到 int 变量
【发布时间】:2018-04-07 22:15:24
【问题描述】:

我有一个字符串数组

sarr := array['s', 's1', ..., 'sn'];
a integer;

我需要将 array_length(sarr, 1) 放入一个整数变量中:

a := select(array_length(sarr, 1))a := array_length(sarr, 1) 不起作用

一个变量只在这里使用

for iter in 1..a
loop
    execute 'alter table temp_table add column col_' || iter || ' 
varchar;';
end loop;

【问题讨论】:

  • 第二个必须工作,你得到什么错误?
  • a := array_length(sarr, 1) 应该可以正常工作。你得到什么错误?
  • 如果我声明 a := 10 例如我没有任何错误并且我的函数工作正常,如果我设置 a := array_length(sarr, 1) 我得到这个:“额外数据在最后一个预期列之后..."
  • 向我们展示完整代码。 “extra data after last expected column”是来自 copy 命令的错误,而不是 PL/pgSQL 编译器错误
  • 我编辑了问题并添加了代码

标签: arrays postgresql function variables plpgsql


【解决方案1】:

存在某种误解。这仅适用于现代 Postgres:

-- DROP TABLE IF EXISTS pg_temp.temp_table;
CREATE TEMP TABLE temp_table (id int PRIMARY KEY);

DO
$do$
DECLARE
   sarr text[]  := array['s', 's1', 'sn'];
   a    integer;
   iter integer;
BEGIN
   a := array_length(sarr, 1);

   FOR iter IN 1..a
   LOOP
      RAISE NOTICE '%', -- safety; replace with execute after testing
   -- EXECUTE 
         'ALTER TABLE temp_table ADD COLUMN col_' || iter || ' varchar;';
   END LOOP;
END
$do$

但是效率低下。执行单个 ALTER 命令添加多个列。没有循环:

DO
$do$
DECLARE
   sarr text[] := array['s', 's1', 'sn'];
BEGIN
   EXECUTE (
      SELECT 'ALTER TABLE temp_table2 ADD COLUMN col_'
          || string_agg(i::text || ' varchar', ', ADD COLUMN col_')
      FROM   generate_subscripts(sarr, 1) i
      );
END
$do$;

相关:

【讨论】:

    猜你喜欢
    • 2017-03-21
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多