考虑一个包含名称的数据库表,该表具备三行: php
Peter Paul Mary
有没有简单的方法能够将其转换为Peter, Paul, Mary
一串文字? html
建议使用递归CTE解决方案,但未提供任何代码。 下面的代码是递归CTE的示例。 请注意,尽管结果符合问题,但数据与给定的描述并不彻底同样 ,由于我假设您确实想对行组(而不是表中的全部行)执行此操做。 进行更改以使其与表中的全部行匹配,以供读者练习。 mysql
;WITH basetable AS ( SELECT id, CAST(name AS VARCHAR(MAX)) name, ROW_NUMBER() OVER (Partition BY id ORDER BY seq) rw, COUNT(*) OVER (Partition BY id) recs FROM (VALUES (1, 'Johnny', 1), (1, 'M', 2), (2, 'Bill', 1), (2, 'S.', 4), (2, 'Preston', 5), (2, 'Esq.', 6), (3, 'Ted', 1), (3, 'Theodore', 2), (3, 'Logan', 3), (4, 'Peter', 1), (4, 'Paul', 2), (4, 'Mary', 3) ) g (id, name, seq) ), rCTE AS ( SELECT recs, id, name, rw FROM basetable WHERE rw = 1 UNION ALL SELECT b.recs, r.ID, r.name +', '+ b.name name, r.rw + 1 FROM basetable b INNER JOIN rCTE r ON b.id = r.id AND b.rw = r.rw + 1 ) SELECT name FROM rCTE WHERE recs = rw AND ID=4
Postgres数组很棒。 例: sql
建立一些测试数据: 数据库
postgres=# \c test You are now connected to database "test" as user "hgimenez". test=# create table names (name text); CREATE TABLE test=# insert into names (name) values ('Peter'), ('Paul'), ('Mary'); INSERT 0 3 test=# select * from names; name ------- Peter Paul Mary (3 rows)
将它们聚合成一个数组: 数组
test=# select array_agg(name) from names; array_agg ------------------- {Peter,Paul,Mary} (1 row)
将数组转换为逗号分隔的字符串: oracle
test=# select array_to_string(array_agg(name), ', ') from names; array_to_string ------------------- Peter, Paul, Mary (1 row)
完成 函数
从PostgreSQL 9.0开始,它变得更加容易 。 post
从PostgreSQL 9.0开始,这很是简单: 测试
select string_agg(name, ',') from names;
在9.0以前的版本中,可使用hgmnz所示的array_agg array_agg()
对于Oracle DB,请参见如下问题: 如何在Oracle中将多个行串联为一个而不建立存储过程?
最好的答案彷佛是@Emmanuel,它使用Oracle 11g第2版及更高版本中提供的内置LISTAGG()函数。
SELECT question_id, LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id) FROM YOUR_TABLE; GROUP BY question_id
正如@ user762952指出的那样,根据Oracle文档http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php,WM_CONCAT ()函数也是一个选择。 它彷佛很稳定,可是Oracle明确建议不要在任何应用程序SQL中使用它,所以,后果自负。
除此以外,您将不得不编写本身的函数; 上面的Oracle文档提供了有关如何执行此操做的指南。
在MySQL中,有一个函数GROUP_CONCAT() ,它容许您将多行中的值链接起来。 例:
SELECT 1 AS a, GROUP_CONCAT(name ORDER BY name ASC SEPARATOR ', ') AS people FROM users WHERE id IN (1,2,3) GROUP BY a