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 中。换句话说,您需要一个单独的表 ContactEmailContact 表没有 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:将字符串拆分为不同的列的主要内容,如果未能解决你的问题,请参考以下文章

在sql中拆分字符串并反转它的函数

使用 Oracle SQL 将可变长度分隔字符串拆分为列

使用 SSIS 包将一个字段中的值拆分为两个值,以便在 SQL Server 中的两个不同字段中使用

MySQL查询将分隔字符串值拆分为单独的列[重复]

将 SQL Server 中的字符串拆分为最大长度,并将每个字符串作为一行返回

使用tidyr将字符串长度不均匀的行拆分为R中的列[重复]