在oracle 11g以前使用wm_concat函数做为字符的聚合较为常见,但后来在11g中引入了listagg函数做为替换方案,随后的12c后就不再支持wm_concat,也算是一种平滑过度,但大量应用可能还需要修改代码, 在opengauss或postgresql中有对应的函数string_agg函数提供相同的功能,同时OCEANBASE和达梦还一样提供wm_concat函数,提高了oracle替代的兼容性。在opengauss中同样也可以创建自定义函数,或postgresql中安装orafce。
CREATE OR REPLACE FUNCTION pg_catalog.vm_concat_state_func (results text, val text)
RETURNS text
LANGUAGE sql COST 50 IMMUTABLE
AS $$ select results || ',' ||val; $$;
CREATE OR REPLACE FUNCTION pg_catalog.vm_concat_final_func (results text)
RETURNS text
LANGUAGE sql COST 111 IMMUTABLE
AS $$ select substr(results, 2); $$;
CREATE AGGREGATE pg_catalog.wm_concat(text)
(
sfunc = pg_catalog.vm_concat_state_func,
stype = text,
initcond = '',
FINALFUNC = pg_catalog.vm_concat_final_func
);
MogDB=# select wm_concat(c1) from t1;
wm_concat
-----------
1,2
(1 row)