在日常工作中會遇到將多行的值拼接為一個值展現,如果使用過Oracle
數據庫,可以使用list_agg
的聚合函數來實現。那么PostgreSQL
也有這樣的功能,函數為string_agg
。具體用法如下:
建表
CREATE TABLE student(
id serial PRIMARY KEY,
name varchar(240),
address varchar(500),
grade varchar(20)
)
錄入測試數據
INSERT INTO student(name,address,grade) values('小A','天河一路','一年級1班');
INSERT INTO student(name,address,grade) values('小B','天河一路','一年級1班');
INSERT INTO student(name,address,grade) values('小C','天河一路','一年級2班');
INSERT INTO student(name,address,grade) values('小D','天河一路','一年級2班');
將同班級的學生拼接顯示
SELECT string_agg(name,',') FROM student GROUP BY grade;
--結果:
string_agg|
----------|
小A,小B |
小C,小D |
如果需要對拼接的值去重,可以這樣處理:
SELECT string_agg(address,',') FROM student GROUP BY grade;
--未去重的情況下:
string_agg|
----------|
天河一路,天河一路 |
天河一路,天河一路 |
SELECT string_agg(distinct address,',') FROM student GROUP BY grade;
string_agg|
----------|
天河一路 |
天河一路 |
如果想對拼接的值做排序,可以在拼接符號后面加order by
SELECT string_agg(name,',' order by name desc) FROM student GROUP BY grade;
--結果:
string_agg|
----------|
小B,小A |
小D,小C |
注意:如果使用了排序且使用了distinct關鍵字去重,order by 的排序字段必須包含去重的字段
比如對grade字段去重,那么order by 后面必須要有grade字段,不然會報:SQL 錯誤 [42P10]: 錯誤: 在帶有DISTINCT子句的聚合函數中,ORDER BY子句后面的表達式必須在參數列表中出現