我有这样的数据:
请尝试以下解决方案。
它正在使用JSON标记标记字符串。
/p> 可以使用STRING_SPLIT()函数,只要确保你的分隔符规范化- 那么你可以像这样使用STRING_SPLIT()函数:-- DDL and sample data population, start
DECLARE @tbl table (ID CHAR(5), ROLE VARCHAR(200), ControlUnit VARCHAR(20), UserID VARCHAR(200))
INSERT @tbl (ID, Role, ControlUnit, UserID) VALUES
('0019', 'SPV / TL / CS', '00G (nol)', '0016506 , 0016551 , 0016541'),
('0023', 'SPV / CS / TL', '14I', '1458506, 1458541, 0435551'),
('0019', 'SPV / CS / TL', '0C3', '0435506, 0435541, 0435551');
-- DDL and sample data population, end
;WITH rs AS
(
SELECT ID, ControlUnit, Role, UserID
, s = '["' + REPLACE(STRING_ESCAPE([Role],'json'), '/', '","') + '"]'
, s1 = '["' + REPLACE(STRING_ESCAPE(UserID,'json'), ',', '","') + '"]'
FROM @tbl
)
SELECT ID, TRIM([Role].[value]) AS [Role], ControlUnit, TRIM(UserID.[value]) AS UserID
FROM rs
CROSS APPLY OPENJSON (s, N'$') AS [Role]
CROSS APPLY OPENJSON (s1, N'$') AS UserID
WHERE [Role].[key] = UserID.[key];
tbody><<tr>ID 角色 ControlUnit UserID 0019 SPV 00 g (nol) 0016506 0019 TL 00 g (nol) 0016551 0019 c 00 g (nol) 0016541 0023 SPV 14我 1458506 0023 c 14我 1458541 0023 TL 14我 0435551 0019 SPV 0 c3 0435506 0019 c 0 c3 0435541 表类>0019 TL 0 c3 0435551 SELECT T.ID AS ID,
Roles.RoleName AS [Role],
T.[Control Unit] AS [Control Unit],
UserIds.UserId AS [User ID]
FROM UsersToRoles AS T
OUTER APPLY
(
SELECT S.ordinal AS RoleOrder,
S.[value] AS RoleName
FROM STRING_SPLIT(T.[Role], ',') AS S
) AS Roles
OUTER APPLY
(
SELECT S.ordinal AS UserIdOrder,
S.[value] AS UserId
FROM STRING_SPLIT(T.[User ID], ',') AS S
) AS UserIds
WHERE UserIds.UserIdOrder = Roles.RoleOrder