1

我正在嘗試創建一個aggregate functionconcatenates號碼由grouping他們。我怎麼去解決它?假設我有一張如下所示的表格。PostgreSQL中的引用屬性

Table Numbers 
123 
145 
187 
105 

我想要的結果看起來像

105_123_145_187 

我知道如何使用group_concat分離_如果我在MySQL正在工作。

我該如何在PostgreSQL中做到這一點?

+0

*永遠*在你的問題中包含你的PostgreSQL版本。你已經看到了爲什麼;你被給了一個答案,但是你正在使用一個沒有這個功能的兩個版本的PostgreSQL,浪費了每個人的時間跟進一個不同的方法。 –

回答

3

已經有這樣的功能:在這裏

SELECT string_agg(num::text,'_') 
FROM Numbers; 

詳情:string_agg

告訴我,如果你使用postgresql 8.4或更早的版本。我會告訴你,如何實現這個函數作爲自定義聚合。

UPD自定義聚合:

CREATE OR REPLACE FUNCTION public.concat_delimited (text, text, text) 
RETURNS text AS 
$body$ 
    SELECT $1 || (CASE WHEN $1 = '' THEN '' ELSE $3 END) || $2; 
$body$ 
LANGUAGE 'sql' 
IMMUTABLE 
RETURNS NULL ON NULL INPUT; 

CREATE AGGREGATE public.text_concat (text, text) 
(
    SFUNC = public.concat_delimited, 
    STYPE = text 
); 
+0

@ignor即時通訊使用早期版本9.0 – theuserkaps

+0

介意如果我問什麼查詢SELECT $ 1 || (CASE當$ 1 =''THEN''ELSE $ 3 END)|| $ 2;做.....是$ 1變量? – theuserkaps

+0

@theuserkaps'$ 1'是函數的第一個參數。 '2美元 - 秒。你可以命名函數參數並使用他們的名字,或者你可以讓它們沒有名字並使用'$ 1','$ 2' ... –

-3

concat_ws(sep text, str "any" [, str "any" [, ...] ])是您需要的功能。

第一個參數是你的分隔符,NULL參數被忽略。詳情請參閱The PostgreSQL manual

我並不熟悉pgSQL,但編寫一個聚合函數的答案將會在那裏,請查閱the pgSQL manual瞭解如何編寫函數。

+1

concat_ws()不是聚合函數。 –

+0

...並且您無論如何都會在這個作業中尋找'array_to_string'而不是'concat_ws'。 –

1

對於現代的PostgreSQL使用string_agg(columnname,'_')

對於舊版本8.4及以上,使用string_to_array(array_agg(columname), '_')

the array functions and operators documentation

例子:

regress=> SELECT array_to_string(array_agg(x::text), ', ') FROM generate_series(1,10) x; 
     array_to_string 
------------------------------- 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 
(1 row) 

始終包括在你的問題你的PostgreSQL版本。