在plpgsql中循环期间替换字符串中的字符

时间:2014-03-25 21:16:46

标签: postgresql loops plpgsql

您可以使用多种语言执行以下操作:

  1. 声明字符串类型的变量
  2. 从0到4进行循环
  3. 在每次迭代期间,您都可以选择并设置字符串的特定字符
  4. 在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中也是如此?

2 个答案:

答案 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中也是如此。