逗号分隔的字符串,用作表的列

时间:2019-03-25 06:32:12

标签: postgresql

我在function中有一个字符串参数。需要将相同的内容用作表列的串联。

我尝试了concat,regexp_substr和其他各种技术,但是没有用

do $$

  declare
      v_11 varchar(100):='col_1,col_2';
      v_timeseries varchar(1000);
  begin
      execute format('
        select case 
          when 1=1 then
            concat(regexp_substr(%I, ''[^,]+'', 1, 1),regexp_substr(%I, ''[^,]+'', 1, 2))
          else
            ''0''
          end as data
        from grp_tab limit 1', v_11, v_11) 
      into v_timeseries;

      raise info 'v_timeseries %',v_timeseries;
end $$;

预期结果:

select col_1||col_2 from grp_tab;

但是我得到的实际结果

Output: col_1Col_2

我们需要将实际值连接起来。

注意:要串联的列值在runtime中可能有所不同。

1 个答案:

答案 0 :(得分:0)

您可以使用split_part。请注意,它可以被提取并用作格式字符串之外的参数。

knayak=# create table grp_tab ( col_1 text, col_2 text);
CREATE TABLE
knayak=# insert into grp_tab(col_1,col_2) values('TEXT1', 'TEXT2');
INSERT 0 1


knayak=# do $$
knayak$# declare
knayak$#  v_11 varchar(100):='col_1,col_2';
knayak$#   v_timeseries varchar(1000);
knayak$#   begin
knayak$#  execute format('select case when 1=1 then %I||%I else ''0''
knayak$#        end as data
knayak$#  from grp_tab limit 1',split_part(v_11,',',1),split_part(v_11,',',2))
knayak$# into v_timeseries;
knayak$# raise info 'v_timeseries %',v_timeseries;
knayak$# end $$;
INFO:  v_timeseries TEXT1TEXT2
DO

如果您之间没有其他逗号,则可以简单地用串联字符串替换逗号,然后将单个参数传递给format。 %s用于将参数值格式化为简单字符串

do $$
declare
 v_11 varchar(100):='col_1,col_2';
 v_cols text := replace(v_11,',', '||');
 v_timeseries varchar(1000);
  begin
 execute format('select case when 1=1 then %s else ''0'' 
       end as data
 from grp_tab limit 1' , v_cols) 
into v_timeseries;
raise info 'v_timeseries %',v_timeseries;
end $$;