SQL Server:将字符串拆分为不同的列
Posted
技术标签:
【中文标题】SQL Server:将字符串拆分为不同的列【英文标题】:SQL Server : splitting string into different columns 【发布时间】:2021-03-13 00:06:47 【问题描述】:我进行了一些搜索并找到了一些示例,但它似乎不适用于我的问题。
我正在写一份报告,并且联系人表中的一列包含一个或多个电子邮件地址,例如 -
Column_name_email
123@test.com, 456@test.com, 789@test.ca
我想把上面的内容分成三列
Email1, Email2, Email3
如果只有一封电子邮件,则两列将为空白并填充Email1
。
【问题讨论】:
制作单独的 columns 可能是个坏主意,您可能希望将它们放在 tows 中。换句话说,您需要一个单独的表ContactEmail
与 Contact
表没有 FK
【参考方案1】:
使用一点 JSON 的另一种选择。与 string_split() 不同...如果需要,这将保持顺序
示例
Declare @YourTable Table ([Column_name_email] varchar(50)) Insert Into @YourTable Values
('123@test.com, 456@test.com, 789@test.ca')
Select A.[Column_name_email]
,B.*
From @YourTable A
Cross Apply (
Select Email1 = trim(JSON_VALUE(S,'$[0]'))
,Email2 = trim(JSON_VALUE(S,'$[1]'))
,Email3 = trim(JSON_VALUE(S,'$[2]'))
From ( values ( '["'+replace(replace([Column_name_email],'"','\"'),',','","')+'"]' ) ) B1(S)
) B
退货
Column_name_email Email1 Email2 Email3
123@test.com, 456@test.com, 789@test.ca 123@test.com 456@test.com 789@test.ca
【讨论】:
谢谢,我会提前给的。【参考方案2】:你可以使用string_split()
然后条件聚合:
select t.*, s.*
from t cross apply
(select max(case when seqnum = 1 then value end) as email1,
max(case when seqnum = 2 then value end) as email2,
max(case when seqnum = 3 then value end) as email3
from (select trim(s.value) as value,
row_number() over (order by charindex(',' + s.value + ',', ',' + t.email + ',')) as seqnum
from string_split(t.email, ',') s
) s
) s;
不幸的是,string_split()
不保留排序。 Aaron Bertrand 对此here 进行了很好的讨论。
【讨论】:
请注意,STRING_SPLIT()
不仅需要 SQL Server 2016,而且您的数据库必须将其兼容级别设置为 130 (SQL Server 2016) 或更高。另请注意,姐妹“逆”函数 STRING_AGG()
直到 SQL Server 2017 才引入。
String_split() 不保证顺序,order by (select null)
也不保证 - 如果这很重要的话。
@SMor 。 . .我“知道”我看到了 Aaron Bertrand 的参考资料,它实际上确实保留了订单,但没有记录在案。也就是说,我链接到最近的一个讨论,说相反。也许我误解了参考(我现在找不到)。所以我更新了答案。
谢谢我之前给的。以上是关于SQL Server:将字符串拆分为不同的列的主要内容,如果未能解决你的问题,请参考以下文章
使用 SSIS 包将一个字段中的值拆分为两个值,以便在 SQL Server 中的两个不同字段中使用