group_concat是mysql中的一個聚集函數,挺好用的,mysql的group_concat使用可參考:http://my.oschina.net/Kenyon/blog/70480。在postgresql中實現這個功能倒也容易,可以用array的轉換或者函數string_agg()來做。?
DB環境:postgresql 9.1.2?
**一.測試數據準備**
~~~
postgres=# create table t_kenyon(id int,name text);
CREATE TABLE
postgres=# insert into t_kenyon values(1,'kenyon'),(1,'chinese'),(1,'china'),('2','american'),('3','japan'),('3','russian');
INSERT 0 6
postgres=# select * from t_kenyon order by 1;
id | name
----+----------
1 | kenyon
1 | chinese
1 | china
2 | american
3 | japan
3 | russian
(6 rows)
~~~
**二.實現過程?**
1.以逗號為分隔符聚集
~~~
postgres=# select array_to_string(ARRAY(SELECT unnest(array_agg(name))),',') from t_kenyon ;
array_to_string
---------------------------------------------
kenyon,chinese,china,american,japan,russian
(1 row)
~~~
?2.結合order by排序
~~~
postgres=# select array_to_string(ARRAY(SELECT unnest(array_agg(name)) order by 1),',') from t_kenyon;
array_to_string
---------------------------------------------
american,china,chinese,japan,kenyon,russian
(1 row)
~~~
?3.結合group聚集
~~~
postgres=# SELECT id, array_to_string(ARRAY(SELECT unnest(array_agg(name))
),',') FROM t_kenyon GROUP BY id;
id | array_to_string
----+----------------------
1 | china,chinese,kenyon
2 | american
3 | japan,russian
(3 rows)
~~~
4.以其他分隔符聚集,如*_*
~~~
postgres=# SELECT id, array_to_string(ARRAY(SELECT unnest(array_agg(name))
order by 1),'*_*') FROM t_kenyon GROUP BY id ORDER BY id;
id | array_to_string
----+--------------------------
1 | china*_*chinese*_*kenyon
2 | american
3 | japan*_*russian
(3 rows)
~~~
還有一個函數更簡:string_agg
<table style="BORDER-TOP: rgb(248,248,248) 1px solid; BORDER-RIGHT: rgb(248,248,248) 1px solid; WIDTH: 703px; WHITE-SPACE: normal; WORD-SPACING: 0px; BORDER-COLLAPSE: collapse; BORDER-BOTTOM: rgb(248,248,248) 1px solid; TEXT-TRANSFORM: none; COLOR: rgb(68,68,68); PADDING-BOTTOM: 0px; TEXT-ALIGN: left; PADDING-TOP: 0px; FONT: 12px/22px 微軟雅黑, Verdana, sans-serif, 宋體; PADDING-LEFT: 0px; MARGIN: 0px; BORDER-SPACING: 1px; BORDER-LEFT: rgb(248,248,248) 1px solid; WIDOWS: 1; LETTER-SPACING: normal; PADDING-RIGHT: 0px; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; -webkit-text-stroke-width: 0px" bordercolor="#e53333" cellspacing="0" cellpadding="2" align="right" border="2"><tbody style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"><tr style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"><td style="BORDER-TOP: rgb(248,248,248) 1px solid; BORDER-RIGHT: rgb(248,248,248) 1px solid; BORDER-BOTTOM: rgb(248,248,248) 1px solid; PADDING-BOTTOM: 1px; PADDING-TOP: 1px; PADDING-LEFT: 2px; MARGIN: 0px; BORDER-LEFT: rgb(248,248,248) 1px solid; PADDING-RIGHT: 2px"><span style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"/>postgres=# create table t_test(id int,vv varchar(100));?<br style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"/>CREATE TABLE?<br style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"/>postgres=# insert into t_test values(1,'kk'),(2,'ddd'),(1,'yy'),(3,'ty');?<br style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"/>INSERT 0 4 ?<br style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"/><br style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"/>postgres=# select * from t_test; ?<br style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"/>id | vv ??<br style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"/>----+----- ??<br style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"/>1 | kk ??<br style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"/>2 | ddd ??<br style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"/>1 | yy ??<br style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"/>3 | ty?<br style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"/>(4 rows) ?<br style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"/><br style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"/>postgres=# select id,string_agg(vv,'*^*') from t_test group by id; ?<br style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"/>id | string_agg ?<br style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"/>----+------------ ??<br style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"/>1 | kk*^*yy ??<br style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"/>2 | ddd ??<br style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"/>3 | ty?<br style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"/>(3 rows)?<br style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"/><br style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px"/></td></tr></tbody></table>
**三.總結**
postgresql也可以很簡單的實現mysql中的group_concat功能,而且更加豐富,可以基于此寫一個同名的函數。
- 數據表
- 模式Schema
- 表的繼承和分區
- 常用數據類型
- 函數和操作符-一
- 函數和操作符-二
- 函數和操作符-三
- 索引
- 事物隔離
- 性能提升技巧
- 服務器配置
- 角色和權限
- 數據庫管理
- 數據庫維護
- 系統表
- 系統視圖
- SQL語言函數
- PL-pgSQL過程語言
- PostgreSQL 序列(SEQUENCE)
- PostgreSQL的時間-日期函數使用
- PostgreSQL 查看數據庫,索引,表,表空間大小
- 用以查詢某表的詳細 包含表字段的注釋信息
- PostgreSQL 系統表查看系統信息
- postgre存儲過程簡單實用方法
- PostgreSQL實用日常維護SQL
- PostgreSQL的時間函數使用整理
- 命令
- pg_ctl控制服務器
- initdb 初始化數據庫簇
- createdb創建數據庫
- dropdb 刪除數據庫
- createuser創建用戶
- dropuser 刪除用戶
- psql交互式工具
- psql命令手冊
- pg_dump 數據庫轉儲
- pg_restore恢復數據庫
- vacuumdb 清理優化數據庫
- reindexdb 數據庫重創索引
- createlang 安裝過程語言
- droplang 刪除過程語言
- pg_upgrade 升級數據庫簇
- 調試存儲過程
- 客戶端命令-一
- 客戶端命令-二
- 使用技巧
- PostgreSQL刪除重復數據
- postgresql 小技巧
- PostgreSQL的10進制與16進制互轉
- PostgreSQL的漢字轉拼音
- Postgres重復數據的更新一例
- PostgreSQL使用with一例
- PostgreSQL在函數內返回returning
- PostgreSQL中的group_concat使用
- PostgreSQL數據庫切割和組合字段函數
- postgresql重復數據的刪除
- PostgreSQL的遞歸查詢(with recursive)
- PostgreSQL函數如何返回數據集
- PostgreSQL分區表(Table Partitioning)應用 - David_Tang - 博客園
- PostgreSQL: function 返回結果集多列和單列的例子
- 利用pgAgent創建定時任務
- 淺談 PostgreSQL 類型轉換類似Oracle
- postgresql在windows(包括win7)下的安裝配置
- PostgreSQL簡介、安裝、用戶管理、啟動關閉、創建刪除數據庫 (2010-11-08 12-52-51)轉載▼標簽: 雜談分類: PostgreSQL
- PostgreSQL的generate_series函數應用
- PostgreSQL 8.3.1 全文檢索(Full Text Search)
- postgresql record 使用
- 備份恢復
- PostgreSQL基于時間點恢復(PITR)
- Postgresql基于時間點恢復PITR案例(二)
- Postgres邏輯備份腳本
- Postgres invalid command \N數據恢復處理