牛骨文教育服务平台(让学习变的简单)
博文笔记

group_concat on postgresql

创建时间:2012-04-26 投稿人: 浏览次数:3376
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, "beer");
INSERT INTO produk (seq_id, name) VALUES (4, "can");
INSERT INTO produk (seq_id, name) VALUES (6, "goods");
INSERT INTO produk (seq_id, name) VALUES (7, "goods");
INSERT INTO produk (seq_id, name) VALUES (8, "can");
INSERT INTO produk (seq_id, 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

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。