【问题标题】:PL/pgSQL query - loop through table issuePL/pgSQL 查询 - 遍历表问题
【发布时间】:2013-02-22 14:28:15
【问题描述】:

我在 PL/pgSQL 中编写了以下函数,它应该遍历一个表并为每个现有行收集存储在 points 列中的值。现在,我的问题是我不太确定是否可以将所有这些字段值连接到单个 character varying 数据类型对象中。

目前我的函数包含以下代码(但它仍然没有按预期工作):

DECLARE 
     _r record;
     point character varying;
     test character varying;

BEGIN

FOR _r IN EXECUTE ' SELECT st_y(a.'|| quote_ident(column_name) || ') AS p1, st_x(a.'||  quote_ident(column_name) || ') AS p2
       FROM ' || quote_ident (table_name) ||' AS a'
LOOP
       test = _r;
       point = point || '|' || test;
END LOOP;

RETURN point;
END;

关于如何以最简单的方式实现这一点的任何建议?

【问题讨论】:

  • 您忘记了函数头,请包含它。我真的不知道为什么有些人会删除标题。它是功能的一个组成部分。还提供示例值和示例您的结果应该是什么样子。并声明你的 Postgres 版本。

标签: sql postgresql concatenation plpgsql


【解决方案1】:

是的,您可以使用内置的string_agg() 函数。如果只是这样,那么一个 SQL 函数就足够了。

create or replace function r()
returns text as $$

    select string_agg(s.*::text, ','::text)
    from (
        values (1, 2), (3, 4)
    ) s(a, b)
    ;
$$ language sql

select r();
      r      
-------------
 (1,2),(3,4)

【讨论】:

  • 您能否详细说明我必须在我的功能中更改的内容。 @Clodoaldo
  • @IT_info:愿意先用要求的说明更新您的问题吗?
【解决方案2】:

另外,point = point || '|' || test; 不会一直覆盖point 吗?

应该是point := point || '|' || test;吗?

另外,_r 被声明为记录,因此必须将 test 设置为 _r.a,因为这是您命名结果的名称。

【讨论】:

    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多