考慮一個包含名稱的數據庫表,該表具備三行: 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