我想在连续的文本输出中输出以下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
?
答案 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
,以减少其混乱
请阅读手册中的这些功能:
unnest()
(PostgreSQL 8.4 +)string_agg()
(PostgreSQL 9.0 +)concat_ws()
(PostgreSQL 9.1 +)答案 1 :(得分:1)
concat运算符是||
,它是SQL标准。
你的问题是没有初始化那个变量所以你正在做的是null || text
,并且将null与any连接的结果为null。你必须像这样初始化它:
DECLARE
output text:='';