使用 SQL 服务器将一列中的字符串中的多个值拆分为多列
Split multiple values from a string in one column, into multiple columns using SQL Server
我在 SQL 服务器中有一个 table 输出以下内容:
CompanyName
CompanyNumber
Tags
1st Comp Ltd
1
Credit broker;Limited Permission Lender;Insurance Intermediary
business.com
456
Investment Advisor;Credit Broking Only
Charity.org
156789
Not for profit
我想拆分标签列中的值,以便每列只有一个标签,所以:
CompanyName
CompanyNumber
Tag1
Tag2
Tag3
1st Comp Ltd
1
Credit broker
Limited Permission Lender
Insurance Intermediary
business.com
456
Investment Advisor
Credit Broking Only
Charity.org
156789
Not for profit
我可以在 excel 中使用分号作为分隔符手动执行此操作,然后调整 headers,但是在 SQL 服务器中可以执行此操作吗?最终,我希望 SQL 服务器中的视图能够格式化数据,这样我就可以让 powershell 脚本生成一个 csv 文件并通过电子邮件发送。
我已经尝试了以下方法,我想我可能快成功了,只是在视图中不起作用:
with TagsDelimited_CTE AS
(select CompanyName, CompanyNumber, Value,
ROW_NUMBER() over(partition by CompanyName, CompanyNumber order by CompanyName, CompanyNumber) as RowNum
from Source
CROSS APPLY
string_split(Tags,';')
)
select CompanyName, CompanyNumber,
[1] as Tag1,
[2] as Tag2,
[3] as Tag3
From TagsDelimited_CTE
PIVOT
(MAX(value)
For RowNum in ([1],[2],[3])) as PVT
任何帮助都会有很大的帮助,谢谢。
有一点 JSON 并假设您有已知或最大数量的标签
Select A.CompanyName
,A.CompanyNumber
,Tag1 = JSON_VALUE(S,'$[0]')
,Tag2 = JSON_VALUE(S,'$[1]')
,Tag3 = JSON_VALUE(S,'$[2]')
From YourTable A
Cross Apply ( values ( '["'+replace(STRING_ESCAPE(Tags,'json'),';','","')+'"]' ) ) B(S)
在 APPLY
内旋转更容易,因为这样您就可以按行旋转。
使用 MAX(CASE
旋转通常也更灵活。
Note that the ordering of the values are not guaranteed
SELECT
s.CompanyName,
s.CompanyNumber,
v.*
FROM Source s
CROSS APPLY (
SELECT
MAX(CASE WHEN rn = 1 THEN Value END) AS Tag1,
MAX(CASE WHEN rn = 2 THEN Value END) AS Tag2,
MAX(CASE WHEN rn = 3 THEN Value END) AS Tag3
FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn
FROM STRING_SPLIT (s.Tags, ';') splitted
) v
) v;
我在 SQL 服务器中有一个 table 输出以下内容:
CompanyName | CompanyNumber | Tags |
---|---|---|
1st Comp Ltd | 1 | Credit broker;Limited Permission Lender;Insurance Intermediary |
business.com | 456 | Investment Advisor;Credit Broking Only |
Charity.org | 156789 | Not for profit |
我想拆分标签列中的值,以便每列只有一个标签,所以:
CompanyName | CompanyNumber | Tag1 | Tag2 | Tag3 |
---|---|---|---|---|
1st Comp Ltd | 1 | Credit broker | Limited Permission Lender | Insurance Intermediary |
business.com | 456 | Investment Advisor | Credit Broking Only | |
Charity.org | 156789 | Not for profit |
我可以在 excel 中使用分号作为分隔符手动执行此操作,然后调整 headers,但是在 SQL 服务器中可以执行此操作吗?最终,我希望 SQL 服务器中的视图能够格式化数据,这样我就可以让 powershell 脚本生成一个 csv 文件并通过电子邮件发送。
我已经尝试了以下方法,我想我可能快成功了,只是在视图中不起作用:
with TagsDelimited_CTE AS
(select CompanyName, CompanyNumber, Value,
ROW_NUMBER() over(partition by CompanyName, CompanyNumber order by CompanyName, CompanyNumber) as RowNum
from Source
CROSS APPLY
string_split(Tags,';')
)
select CompanyName, CompanyNumber,
[1] as Tag1,
[2] as Tag2,
[3] as Tag3
From TagsDelimited_CTE
PIVOT
(MAX(value)
For RowNum in ([1],[2],[3])) as PVT
任何帮助都会有很大的帮助,谢谢。
有一点 JSON 并假设您有已知或最大数量的标签
Select A.CompanyName
,A.CompanyNumber
,Tag1 = JSON_VALUE(S,'$[0]')
,Tag2 = JSON_VALUE(S,'$[1]')
,Tag3 = JSON_VALUE(S,'$[2]')
From YourTable A
Cross Apply ( values ( '["'+replace(STRING_ESCAPE(Tags,'json'),';','","')+'"]' ) ) B(S)
在 APPLY
内旋转更容易,因为这样您就可以按行旋转。
使用 MAX(CASE
旋转通常也更灵活。
Note that the ordering of the values are not guaranteed
SELECT
s.CompanyName,
s.CompanyNumber,
v.*
FROM Source s
CROSS APPLY (
SELECT
MAX(CASE WHEN rn = 1 THEN Value END) AS Tag1,
MAX(CASE WHEN rn = 2 THEN Value END) AS Tag2,
MAX(CASE WHEN rn = 3 THEN Value END) AS Tag3
FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn
FROM STRING_SPLIT (s.Tags, ';') splitted
) v
) v;