postgresql array_length为int变量

时间:2017-10-26 13:36:32

标签: arrays postgresql function variables plpgsql

我有一个字符串数组

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;

1 个答案:

答案 0 :(得分:0)

存在某种误解。这只适用于现代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$;

相关: