我在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
中可能有所不同。
答案 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 $$;