如何在SQL Server中將多行文本合併爲單個文本字符串?

考慮一個包含名稱的數據庫表,該表具備三行: php

Peter
Paul
Mary

有沒有簡單的方法能夠將其轉換爲Peter, Paul, Mary一串文字? html


#1樓

建議使用遞歸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

#2樓

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


#3樓

從PostgreSQL 9.0開始,這很是簡單: 測試

select string_agg(name, ',') 
from names;

在9.0以前的版本中,可使用hgmnz所示的array_agg array_agg()


#4樓

對於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文檔提供了有關如何執行此操做的指南。


#5樓

在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
相關文章
相關標籤/搜索