PostgreSQL實現字符串拼接


  在日常工作中會遇到將多行的值拼接為一個值展現,如果使用過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子句后面的表達式必須在參數列表中出現


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM