SqlServer-STUFF拼接列表

博客主要介绍了数据库操作,包括创建OrderInfo和OrderProduct表,向这两个表插入数据,还展示了查询表数据的操作。此外,分别演示了同一张表数据拼接和不同表数据拼接的SQL语句,帮助读者掌握数据库表操作及数据拼接技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建OrderInfo 表

CREATE TABLE OrderInfo 
(
    OrderGuid uniqueidentifier not null,
    LoginId varchar(50) not null,
)

创建OrderProduct表

CREATE TABLE OrderProduct
(
    ProductGuid uniqueidentifier not null,
    ProductName varchar(100) not null,
    OrderGuid uniqueidentifier not null,
)

向OrderInfo 表插入数据

insert into OrderInfo(OrderGuid,LoginId)values(NEWID(),'15678975078')
insert into OrderInfo(OrderGuid,LoginId)values(NEWID(),'15678975078')
insert into OrderInfo(OrderGuid,LoginId)values(NEWID(),'15678971111')
insert into OrderInfo(OrderGuid,LoginId)values(NEWID(),'15678971111')
insert into OrderInfo(OrderGuid,LoginId)values(NEWID(),'15678971111')
insert into OrderInfo(OrderGuid,LoginId)values(NEWID(),'15678971111')
insert into OrderInfo(OrderGuid,LoginId)values(NEWID(),'15678971111')
insert into OrderInfo(OrderGuid,LoginId)values(NEWID(),'15678973333')

select * from OrderInfo

向OrderProduct表插入数据

insert into OrderProduct(ProductGuid,ProductName,OrderGuid)values(NEWID(),'黑人牙膏','6646A662-6570-4A0D-B359-1B45D8441BA6')
insert into OrderProduct(ProductGuid,ProductName,OrderGuid)values(NEWID(),'玻尿酸补水喷雾','6646A662-6570-4A0D-B359-1B45D8441BA6')
insert into OrderProduct(ProductGuid,ProductName,OrderGuid)values(NEWID(),'白色帆布鞋','4B800C54-FDD8-496C-8414-C7122F708AA9')
insert into OrderProduct(ProductGuid,ProductName,OrderGuid)values(NEWID(),'手镯','918DAD4C-71BA-4DBB-BD1D-09B5A75320F8')
insert into OrderProduct(ProductGuid,ProductName,OrderGuid)values(NEWID(),'信纸','918DAD4C-71BA-4DBB-BD1D-09B5A75320F8')
insert into OrderProduct(ProductGuid,ProductName,OrderGuid)values(NEWID(),'米老鼠','918DAD4C-71BA-4DBB-BD1D-09B5A75320F8')
insert into OrderProduct(ProductGuid,ProductName,OrderGuid)values(NEWID(),'矿泉水','F8E1499F-6EEC-4AE6-8E77-0166D95116E1')
insert into OrderProduct(ProductGuid,ProductName,OrderGuid)values(NEWID(),'眼镜','F8E1499F-6EEC-4AE6-8E77-0166D95116E1')
insert into OrderProduct(ProductGuid,ProductName,OrderGuid)values(NEWID(),'机柜','4B800C54-FDD8-496C-8414-C7122F708AA9')

select * from OrderProduct

同一张表数据的拼接

SELECT  p2.LoginId, OrderGuid = STUFF((
            SELECT ',' + convert(varchar(36),OrderGuid)
            FROM OrderInfo AS p1
            WHERE p1.LoginId = p2.LoginId
            FOR XML PATH('')
            ), 1, 1, '') FROM OrderInfo AS p2
GROUP BY p2.LoginId

SELECT  p2.OrderGuid, ProductName = STUFF((
            SELECT ',' + ProductName
            FROM OrderProduct AS p1
            WHERE p1.OrderGuid = p2.OrderGuid
            FOR XML PATH('')
            ), 1, 1, '') FROM OrderProduct AS p2
GROUP BY p2.OrderGuid

不同表数据的拼接

SELECT  p2.OrderGuid,p2.LoginId, ProductName = STUFF((
            SELECT ',' + ProductName
            FROM OrderProduct AS p1
            WHERE p1.OrderGuid = p2.OrderGuid
            FOR XML PATH('')
            ), 1, 1, '') FROM OrderInfo AS p2
GROUP BY p2.OrderGuid,p2.LoginId

 

 

在 SQL Server 中将一列数据拼接成一个字符串,可以采用多种方法实现。以下是几种常见的实现方式: ### 使用 `FOR XML PATH` 方法 这是较为常用的一种方法,适用于需要将多行数据合并为单个字符串的场景。通过 `FOR XML PATH('')` 可以将查询结果集中的某一列值拼接成一个连续的字符串,并且可以通过添加分隔符(如逗号)来区分不同的值。 例如,假设有一个表 `PAY`,其中包含字段 `FEE_IDS`,需要将所有符合条件的 `FEE_IDS` 值拼接成一个以逗号分隔的字符串,可以使用如下 SQL 语句: ```sql SELECT FEE_IDS + ',' FROM dbo.PAY(NOLOCK) WHERE PSUBTOTAL_ID IN (1283, 151, 16551, 1421) FOR XML PATH('') ``` 此方法的关键在于 `FOR XML PATH('')` 的使用,它允许将多行的结果合并为一行输出[^4]。 ### 使用 `STUFF` 函数结合 `FOR XML PATH` 为了除最终字符串末尾多余的分隔符,可以在上述基础上使用 `STUFF` 函数。`STUFF` 函数可以删除指定位置开始的指定长度的字符,并在此位置插入新的字符串。这样就可以有效地移除最后一个不必要的分隔符。 示例 SQL 如下: ```sql SELECT STUFF( (SELECT ',' + FEE_IDS FROM dbo.PAY(NOLOCK) WHERE PSUBTOTAL_ID IN (1283, 151, 16551, 1421) FOR XML PATH('')), 1, 1, '') AS ConcatenatedString ``` 在这个例子中,`STUFF` 函数用于移除最前面的逗号,从而得到干净的字符串输出[^3]。 ### 使用变量赋值方法 另一种方法是利用局部变量来累积拼接结果。这种方法适用于较小的数据集,因为对于非常大的数据集来说可能会有性能问题。 定义一个变量并初始化为空字符串,然后通过 `SELECT` 语句循环更新该变量,每次迭代都将当前行的值添加到变量中,同时加上分隔符。 示例代码如下: ```sql DECLARE @ConcatenatedString NVARCHAR(MAX) SET @ConcatenatedString = '' SELECT @ConcatenatedString = @ConcatenatedString + ',' + FEE_IDS FROM dbo.PAY(NOLOCK) WHERE PSUBTOTAL_ID IN (1283, 151, 16551, 1421) -- 移除开头的逗号 SELECT SUBSTRING(@ConcatenatedString, 2, LEN(@ConcatenatedString) - 1) ``` 这种方法简单直观,但是需要注意的是,在处理大量数据时可能会影响性能[^5]。 以上就是在 SQL Server 中将一列数据拼接成一个字符串的几种方法。每种方法都有其适用场景和特点,可以根据实际需求选择合适的方式使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值