gpt4 book ai didi

tsql - TSQL:用分号分隔的值将一列拆分为多行

转载 作者:行者123 更新时间:2023-12-04 16:19:29 37 4
gpt4 key购买 nike

尝试从旧数据库迁移到存储数据的新数据库有点不同。

在一种特定情况下,我有一列用分号分隔的值,我想将其分隔成多行。

这是一个例子:

SELECT 
p.idperson,
p.roleperson
FROM person p


上面的TSQL生成以下输出

idperson roleperson
1001 ;214401;
1002 ;214201;214401;
1003 ;212101;


我想将其转换为:

idperson roleperson
1001 214401
1002 214401
1002 214201
1003 212101


也就是说,我想将具有多个值的行拆分为两行。不创建游标或循环就可以吗?

最佳答案

在撰写本文时,我想出了使用交叉应用和自定义拆分功能执行此操作的简便方法。因此,不仅要问这个问题,我还将发布如何使用此自包含的SQL解决它;)

-- set up a split function
GO
CREATE FUNCTION [dbo].[TempSplit] (@sep char(1), @s varchar(512))
RETURNS table
AS
RETURN (
WITH Pieces(pn, start, stop) AS (
SELECT 1, 1, CHARINDEX(@sep, @s)
UNION ALL
SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
FROM Pieces
WHERE stop > 0
)
SELECT pn,
SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
FROM Pieces
)
GO

-- set up some test data
DECLARE @personroles TABLE
(
idperson INT,
rawroleoptions NVARCHAR(MAX)
)

INSERT INTO @personroles VALUES (1, ';1;2;3;')
INSERT INTO @personroles VALUES (2, ';4;5;6;')
INSERT INTO @personroles VALUES (3, ';7;')

-- the actual work --
;WITH data AS
(
SELECT
p.idperson,
p.rawroleoptions

FROM @personroles p
)
SELECT * FROM data r
CROSS APPLY
(SELECT s AS [ExtractedValue] FROM dbo.TempSplit(';',r.rawroleoptions) WHERE LEN(s)>0) d

-- clean up --
GO
DROP FUNCTION dbo.TempSplit
GO


执行完上述操作后,这就是SQL的输出。

关于tsql - TSQL:用分号分隔的值将一列拆分为多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12075263/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com