在plpgsql中连接输出

时间:2013-03-17 10:08:42

标签: sql postgresql concatenation aggregate-functions plpgsql

我想在连续的文本输出中输出以下plpgsql函数的结果。

我该怎么办呢?我希望有类似的东西:

output = output + 'new point';

到目前为止我的功能:

DECLARE 
    descriptions text[];
    i text;
    counter int := 1;
    _r record;
    output text;

BEGIN

    descriptions = string_to_array(description, ',');

    FOREACH i IN ARRAY descriptions

    LOOP

        FOR _r IN EXECUTE 'select point_id as id, name_of_location as name, description as desc
                   from information_on_point_of_interest
                   where description = '''||descriptions[counter]||''''

        LOOP
            output := output + _r.id || ',' || _r.name || ',' || _r.desc || '|';

        END LOOP;

    END LOOP;

RETURN output;

END;
似乎不支持

output := output + new point

2 个答案:

答案 0 :(得分:2)

为什么?

您的功能失败,因为您没有初始化output。它始于NULL保持NULL,因为NULL || anything会导致NULL

您还应该使用concat_ws()来获取连续列中任何NULL值的信息。

正确的解决方案

使用这个简单的SQL查询可以更快(更正)地完成您要实现的目标:

SELECT string_agg(concat_ws(',', point_id, name_of_location, description), '|')
FROM  (SELECT unnest(string_to_array(description_list, ',')) AS description) x
JOIN   information_on_point_of_interest USING (description);

我将您的说明列表重命名为description_list,以减少其混乱 请阅读手册中的这些功能:

答案 1 :(得分:1)

concat运算符是||,它是SQL标准。

你的问题是没有初始化那个变量所以你正在做的是null || text,并且将null与any连接的结果为null。你必须像这样初始化它:

DECLARE 
    output text:='';

http://sqlfiddle.com/#!12/9e854/1