在 SQL 中拆分多个字符串

Split multiple strings in SQL

我正在尝试同时拆分多列字符串。

我的原始数据如下:

表 1

UserID Type ProductID
1 A, B 001, 003

我想以

结束
UserID Type ProductID
1 A 001
1 B 003

当我使用

select *
from Table1
cross apply string_split(Type, ',')
cross apply string_split(ProductID, ',')

我最终得到了我不想要的 table...

UserID Type ProductID
1 A 001
1 B 003
1 A 003
1 B 001

如何同时拆分多列字符串?

在 SQL Server 2016 及更高版本中,您可以使用 OPENJSON 以确定性顺序拆分字符串。鉴于此示例数据:

CREATE TABLE dbo.Table1
(
   UserID int, 
   Type varchar(255), 
   ProductID varchar(255)
);

INSERT dbo.Table1(UserID, Type, ProductID)
VALUES(1, 'A, B', '001, 003');

您可以使用此查询:

SELECT t.UserID, [Type] = LTRIM(j1.value), Product = LTRIM(j2.value)
FROM dbo.Table1 AS t
CROSS APPLY OPENJSON
  (CONCAT('["',REPLACE(STRING_ESCAPE(Type, 'json'),',','","'),'"]')
) AS j1
CROSS APPLY OPENJSON
  (CONCAT('["',REPLACE(STRING_ESCAPE(ProductID, 'json'),',','","'),'"]')
) AS j2
WHERE j1.[key] = j2.[key];

产生此输出:

UserID Type Product
1 A 001
1 B 003

您可以使用STRING_SPLIT 拆分字符串,row_number 在连接和[=中创建ID 13=]加入如下

select a.UserID,Type1,ProductID from 
(SELECT 
    UserID,value Type1 ,row_number() over (order by   value asc) rn
FROM Table1 
  cross apply  STRING_SPLIT(Type, ',')) a
  JOIN /*subquery*/
(SELECT 
    UserID,value ProductID,row_number() over (order by   value asc)   rn
FROM Table1
  cross apply  STRING_SPLIT(ProductID, ',')) b
  on a.rn=b.rn
  order by ProductID desc