2013-02-22 43 views
-1

我在PL/pgSQL中編寫了以下函數,它應該循環遍歷一個表並收集存儲在每個現有行的points列中的值。現在,我的問題是,我不太確定是否可以將所有這些字段值連接成一個單一的數據類型對象character varyingPL/pgSQL查詢 - 循環表問題

目前我的函數包含下面的代碼(但是它仍然無法正常運行):

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; 

如何以最簡單的方式做到這一點有什麼建議?

+5

您忘記了功能標題,請包括它。我真的不知道爲什麼有些人刪除標題。這是該功能的組成部分。還要提供示例值和示例結果應該是什麼樣子。並聲明你的Postgres版本。 – 2013-02-22 16:52:28

回答

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) 
+0

請你詳細說明一下我在功能上的改變。 @Clodoaldo – 2013-02-22 17:41:31

+1

@IT_info:首先謹慎地更新您的問題並提供所需的說明? – 2013-02-22 22:23:14

0

而且,就不會這樣point = point || '|' || test;不斷改寫point

是否應該是point := point || '|' || test;

另外,_r被聲明爲記錄,所以測試將不得不被設置爲_r.a,因爲這就是您命名的結果。