您可以使用多种语言执行以下操作:
在php中:
$str = '';
for($i=0;$i<5;$i++){
$str .= $i;
}
在javascript中:
var str = '';
for(i=0;i<5;i++){
str += i;
}
在变量&#34; str&#34;之上的两种情况下将包含字符串&#34; 01234&#34;
那么,你能在plpgsql中做同样的事吗
我看到有text []和varchar []。 还有很多字符串功能。也许rpad可以帮助完成这个?
我尝试的是以下内容:
CREATE OR REPLACE FUNCTION test()
RETURNS varchar[] AS $str$
declare str varchar[];
BEGIN
for x in 0..4
loop
str[x] := '_';
end loop;
return str;
END;
$str$ LANGUAGE plpgsql;
但是电话的结果是:
[0:4]={_,_,_,_,_}
我做错了什么?是否有可能在php / js中做同样的事情,即使在postgres中也是如此?
答案 0 :(得分:2)
正如您的php或JS代码不使用数组一样,plpgsql不需要或希望数组在循环中构建字符串,||
连接运算符就足够了。
CREATE OR REPLACE FUNCTION test() RETURNS text AS $str$
DECLARE
str text:='';
x int;
BEGIN
for x in 0..4
loop
str := str || chr(ascii('0')+x);
end loop;
return str;
END;
$str$ LANGUAGE plpgsql;
演示:
select test(); test ------- 01234
更新以下评论:
如果预先存在str
并且应在其中替换字符,请使用overlay
。
CREATE OR REPLACE FUNCTION test(str text) RETURNS text AS $str$
DECLARE
x int;
BEGIN
for x in 0..4
loop
str := overlay(str PLACING chr(ascii('0')+x) FROM x+1);
end loop;
return str;
END;
$str$ LANGUAGE plpgsql;
演示:
select test('abcdefghi'); test ----------- 01234fghi
答案 1 :(得分:0)
当然,在使用SQL时,几乎总会有一个更优雅,更高效的基于集合的解决方案:
SELECT overlay('fooxxxxxxxbar' PLACING string_agg(g::text, '') FROM 4 FOR 7)
FROM generate_series (1,4) g;
结果:
foo1234bar
同时证明overlay()
可以用任何其他字符串替换任何长度的字符串。
来自过程语言,您必须使用基于集合的声明式语言(如SQL)重新思考您的方法。 PL / pgSQL添加了过程元素,但是基于集合的方法在大多数情况下(如果可能)都是优越的,即使在PL / pgSQL中也是如此。