主流數(shù)據(jù)庫(SQL Server、Mysql、Oracle)通過sql實(shí)現(xiàn)多行數(shù)據(jù)合為一行
一、SQL Server
1、方法一:使用 STUFF 和 FOR XML PATH 進(jìn)行多行合并成一行
(1)FOR XML PATH用法
FOR XML
是 SQL Server 提供的一種功能,允許您將查詢結(jié)果轉(zhuǎn)換為 XML 格式。PATH
模式則是其中一種靈活的方式來構(gòu)造自定義的XML結(jié)構(gòu)。
1、基本字符串連接: 當(dāng)您想從單列中提取所有行的數(shù)據(jù)并連接成一個字符串列表時(shí),可以使用 FOR XML PATH('')
。
例如,假設(shè)有一個包含開發(fā)任務(wù)名稱的 rwmc
列:
SELECT
rwmc + ','
FROM table_name
FOR XML PATH('')
這段sql執(zhí)行的結(jié)果將會返回一個XML字符串,其中每個任務(wù)名稱后面跟著逗號,所有名稱連接在一起。如下:
2、指定元素標(biāo)簽: 若要將每個值包裝在特定的XML元素內(nèi),您可以指定元素名稱:
SELECT
rwmc as 'rwmcName'
FROM table_name
FOR XML PATH('rwmc')
這將返回每個部門名稱都在 <rwmcName>
元素內(nèi)的XML結(jié)構(gòu)。
3、創(chuàng)建嵌套結(jié)構(gòu): 若要創(chuàng)建更復(fù)雜的嵌套結(jié)構(gòu),可以結(jié)合 AS
關(guān)鍵字和 XPath 表達(dá)式:
SELECT zyap,
(
SELECT
rwmc
FROM table_name as d
FOR XML PATH('rwmc'),TYPE
)
FROM table_name AS e
FOR XML PATH('rwmcName'), ROOT('rwmcNames');
上述查詢會創(chuàng)建一個XML文檔,其中包含一個名為 rwmcNames
的根元素,每個任務(wù)是一個 rwmcName
元素,zyap
是一個屬性,而每個r任務(wù)名稱則嵌套在 rwmc
元素中。
4、消除尾部逗號: 如果在連接字符串時(shí)不需要末尾的分隔符(如逗號),通常會配合 STUFF()
和 SUBSTRING()
函數(shù)去除最后一個字符:
SELECT STUFF(
(SELECT
','+rwmc
FROM table_name
WHERE mainid='03'
FOR XML PATH('')
), 1, 1, ''
) AS UnitsList;
5、類型指示符:
-
TYPE
:返回的結(jié)果是XML數(shù)據(jù)類型,而不是字符串。 -
ELEMENTS
:在PATH模式下強(qiáng)制所有標(biāo)量值成為元素,而不是屬性。
6、注意事項(xiàng)
- 在
FOR XML PATH
中,空格和特殊字符可能會被轉(zhuǎn)義,如果需要原樣輸出文本,可以使用TEXTPATH
或者設(shè)置OPTION (QUOTE_IDENTIFIER OFF)
。 - 對于復(fù)雜層次的XML構(gòu)建,或者需要完全控制XML結(jié)構(gòu)的情況,可能需要結(jié)合
FOR XML EXPLICIT
使用。
(2)STUFF 用法
STUFF()
函數(shù)在 SQL Server 中主要用于對字符串操作,它能實(shí)現(xiàn)兩個主要功能:
- 刪除字符串中的指定部分字符。
- 插入新的字符序列到原始字符串中的指定位置。
以下是 STUFF()
函數(shù)的基本語法和用法:
STUFF ( character_expression, start, length, add_string )
-
character_expression
: 這是要進(jìn)行操作的原始字符串表達(dá)式。它可以是常量、變量或列名等。 -
start
: 此參數(shù)表示從原始字符串的哪個位置開始刪除字符。這個位置是從1開始計(jì)數(shù)的,即第一個字符的位置是1。 -
length
: 指定要從start
位置開始刪除多少個字符。如果length
為0,則不刪除任何字符,僅插入add_string
。 -
add_string
: 要插入到原始字符串中的新字符序列。在刪除了start
位置開始的length
個字符后,這個字符串將被插入到指定位置。
-- 示例1:刪除并替換字符串中的部分內(nèi)容
DECLARE @originalString NVARCHAR(100) = 'Hello, World!';
SELECT STUFF(@originalString, 7, 6, 'there');
-- 結(jié)果:'Hello, there!'
-- 此例中,從第7個位置開始刪除了6個字符('World'),然后插入了'there'。
-- 示例2:簡單插入字符串
DECLARE @anotherString VARCHAR(50) = 'SQLServer';
SELECT STUFF(@anotherString, 7, 0, '2019 ');
-- 結(jié)果:'SQL2019 Server'
-- 此例中,沒有刪除任何字符,而是在第7個位置插入了'2019 '。
-- 示例3:在具有多個記錄的表中使用STUFF進(jìn)行字符串拼接
SELECT
ID,
STUFF((
SELECT ', ' + AnotherColumn
FROM YourTable AS YT2
WHERE YT1.ID = YT2.ID -- 確保只拼接同一ID下的記錄
FOR XML PATH ('')
), 1, 2, '') AS ConcatenatedValues
FROM YourTable AS YT1
GROUP BY ID;
-- 這個例子中,STUFF與FOR XML PATH結(jié)合使用來拼接同一個ID下AnotherColumn列的所有值,以逗號+空格分隔,并移除了開頭產(chǎn)生的額外的', '。
(3)實(shí)現(xiàn)多行數(shù)據(jù)合并為一行
下面的sql可以直接使用
SELECT STUFF(
(SELECT
','+column_name --這里替換為你的列名
FROM your_table --這里替換為你的表名
--這里添加你的查詢條件
FOR XML PATH('')
), 1, 1, ''
) AS UnitsList;
方法二:使用 STRING_AGG
函數(shù)
(1)STRING_AGG用法
STRING_AGG()
是一個在 SQL 中用于將多行數(shù)據(jù)合并成一列字符串的聚合函數(shù),在 SQL Server 2017 及更高版本中,STRING_AGG()
函數(shù)的基本用法如下:
STRING_AGG ( expression, separator )
-
expression
: 這是你想要連接起來的列或表達(dá)式的名稱,或者是你要拼接的字符串字面量。 -
separator
: 這是在連接相鄰字符串之間的分隔符,可以是任何字符或字符串。
(2)實(shí)現(xiàn)多行數(shù)據(jù)合并為一行
例如,假設(shè)有一個包含開發(fā)任務(wù)名稱的 rwmc
列,你想把所有任務(wù)名稱連接起來,中間用逗號分隔:
SELECT STRING_AGG(rwmc, ', ') AS rwmc
FROM table_name
GROUP BY SomeGroupingColumn; -- 如果需要按某個字段分組,如果你不需要分組,直接將所有行連接起來,則可以省略 GROUP BY 子句。
二、Oracle
1、方法一:使用 LISTAGG
函數(shù)
LISTAGG
是Oracle從11g Release 2版本開始提供的內(nèi)置聚合函數(shù),它可以方便地將多行數(shù)據(jù)按指定分隔符串聯(lián)起來:
SELECT
LISTAGG(value_column, ',') WITHIN GROUP (ORDER BY value_column) AS merged_column
FROM your_table
2、方法二:使用 WM_CONCAT
函數(shù)
WM_CONCAT
是Oracle的一個非標(biāo)準(zhǔn)函數(shù),曾經(jīng)在早期版本中非常流行,但是在官方文檔中并未正式支持。盡管如此,在某些舊版本的Oracle數(shù)據(jù)庫中仍可找到這個函數(shù)并使用它來合并數(shù)據(jù):
SELECT
WM_CONCAT(value_column) AS merged_column
FROM your_table
3、方法三:使用 XMLAGG
函數(shù)結(jié)合 XMLELEMENT
和 XMLSERIALIZE
當(dāng)LISTAGG
函數(shù)無法滿足需求,比如合并后的字符串長度超過限制時(shí),可以采用XML相關(guān)的函數(shù)來實(shí)現(xiàn):
SELECT
RTRIM(XMLAGG(XMLELEMENT(e, value_column || ',')).EXTRACT('//text()'), ',') AS merged_column
FROM your_table
三、Mysql
1、方法一:使用 GROUP_CONCAT()
函數(shù)
GROUP_CONCAT()
是MySQL內(nèi)置的聚合函數(shù),可以用來將同一分組內(nèi)的多個值合并成一個字符串,以指定的分隔符分隔各個值:文章來源:http://www.zghlxwxcb.cn/news/detail-846581.html
SELECT
GROUP_CONCAT(column2 SEPARATOR ',') AS merged_column
FROM your_table
--column1 是你想要分組的列,column2 是你想合并的列,而 , 是分隔符,你可以替換為你想要的任何字符。
2、方法二: 子查詢結(jié)合 GROUP_CONCAT()
函數(shù)
如果你需要更復(fù)雜的合并邏輯,可以結(jié)合子查詢來使用 GROUP_CONCAT()
:文章來源地址http://www.zghlxwxcb.cn/news/detail-846581.html
SELECT t1.id,
(SELECT GROUP_CONCAT(column2 SEPARATOR ', ')
FROM your_table t2
WHERE t1.id = t2.id) AS merged_column
FROM your_table t1;
到了這里,關(guān)于主流數(shù)據(jù)庫(SQL Server、Mysql、Oracle)通過sql實(shí)現(xiàn)多行數(shù)據(jù)合為一行的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!