group_concat on postgresql

CREATE TABLE produk
(
seq_id serial NOT NULL,name character varying(100) NOT NULL
) ;

INSERT INTO produk (seq_id,name) VALUES (1,'beer');
INSERT INTO produk (seq_id,name) VALUES (2,'in');
INSERT INTO produk (seq_id,name) VALUES (3,name) VALUES (4,'can');
INSERT INTO produk (seq_id,name) VALUES (6,'goods');
INSERT INTO produk (seq_id,name) VALUES (7,name) VALUES (8,name) VALUES (5,'goods');

MySQL:

select name,group_concat(cast(seq_id as char)) as id_of_duplicates
from produk
group by name
order by name;


PostgreSQL:

create aggregate array_accum (
sfunc = array_append,basetype = anyelement,stype = anyarray,initcond = '{}'
);

CREATE OR REPLACE FUNCTION _group_concat(text,text)
RETURNS text AS $$
SELECT CASE
WHEN $2 IS NULL THEN $1
WHEN $1 IS NULL THEN $2
ELSE $1 operator(pg_catalog.||) ',' operator(pg_catalog.||) $2
END
$$ IMMUTABLE LANGUAGE SQL;

CREATE AGGREGATE group_concat (
BASETYPE = text,SFUNC = _group_concat,STYPE = text
);


first approach:

select name,array_accum(seq_id)
from produk
group by name

select name,array_to_string(array_accum(seq_id),',')
from produk
group by name;


second approach (mysql-compatible approach):

select name,group_concat(seq_id) as id_of_duplicates
from produk
group by name
order by name;


MySQL GROUP_CONCAT with ordering:

select name,group_concat(cast(seq_id as char) order by seq_id) as id_of_duplicates
from produk
group by name
order by name;


PostgreSQL equivalent:

select name,group_concat(distinct seq_id) as id_of_duplicates
from produk
group by name
order by name;


using customized sort:

select name,group_concat(seq_id) as id_of_duplicates
from
(
select name,seq_id
from produk
order by name,seq_id
) as x
group by name


http://s2.diffuse.it/blog/show/10-group_concat_on_postgresql

相关文章

文章浏览阅读601次。Oracle的数据导入导出是一项基本的技能,...
文章浏览阅读553次。开头还是介绍一下群,如果感兴趣polardb...
文章浏览阅读3.5k次,点赞3次,收藏7次。折腾了两个小时多才...
文章浏览阅读2.7k次。JSON 代表 JavaScript Object Notation...
文章浏览阅读2.9k次,点赞2次,收藏6次。navicat 连接postgr...
文章浏览阅读1.4k次。postgre进阶sql,包含分组排序、JSON解...