我正在嘗試創建一個aggregate function
那concatenates
號碼由grouping
他們。我怎麼去解決它?假設我有一張如下所示的表格。PostgreSQL中的引用屬性
Table Numbers
123
145
187
105
我想要的結果看起來像
105_123_145_187
我知道如何使用group_concat
分離_
如果我在MySQL正在工作。
我該如何在PostgreSQL中做到這一點?
我正在嘗試創建一個aggregate function
那concatenates
號碼由grouping
他們。我怎麼去解決它?假設我有一張如下所示的表格。PostgreSQL中的引用屬性
Table Numbers
123
145
187
105
我想要的結果看起來像
105_123_145_187
我知道如何使用group_concat
分離_
如果我在MySQL正在工作。
我該如何在PostgreSQL中做到這一點?
已經有這樣的功能:在這裏
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
);
@ignor即時通訊使用早期版本9.0 – theuserkaps
介意如果我問什麼查詢SELECT $ 1 || (CASE當$ 1 =''THEN''ELSE $ 3 END)|| $ 2;做.....是$ 1變量? – theuserkaps
@theuserkaps'$ 1'是函數的第一個參數。 '2美元 - 秒。你可以命名函數參數並使用他們的名字,或者你可以讓它們沒有名字並使用'$ 1','$ 2' ... –
concat_ws(sep text, str "any" [, str "any" [, ...] ])
是您需要的功能。
第一個參數是你的分隔符,NULL參數被忽略。詳情請參閱The PostgreSQL manual。
我並不熟悉pgSQL,但編寫一個聚合函數的答案將會在那裏,請查閱the pgSQL manual瞭解如何編寫函數。
concat_ws()不是聚合函數。 –
...並且您無論如何都會在這個作業中尋找'array_to_string'而不是'concat_ws'。 –
對於現代的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版本。
*永遠*在你的問題中包含你的PostgreSQL版本。你已經看到了爲什麼;你被給了一個答案,但是你正在使用一個沒有這個功能的兩個版本的PostgreSQL,浪費了每個人的時間跟進一個不同的方法。 –