【问题标题】:How to apply string split function on multiple columns in SQL Server如何在 SQL Server 中的多个列上应用字符串拆分功能
【发布时间】:2021-04-29 18:02:19
【问题描述】:

我有这样的数据,请帮忙

id  | name    | value
----+---------+---------
1   | a, b    | 12, 34

我想得到这样的输出:

id  | name  | value
----+-------+---------
 1  | a     |  12  
 1  | b     |  34 

【问题讨论】:

  • 仅供参考:您可能会考虑规范化您的表格。那么你就不必进行这些类型的拆分了。
  • 那些逗号分隔的字符串总是成对的吗?或者可以有超过 2 个项目,例如"a, b, c" 的名称和 "12, 43, 56" 的值
  • paul:它们并不总是成对的,如果我们有 100 行,有些行只包含 1 个值,有些包含 2,有些包含 3,所以它不是静态的,

标签: sql sql-server database string split


【解决方案1】:

只是另一种选择(戈登对我来说太快了)

JSON [Key] 是一个正确的序列...假设两列具有相同数量的元素。

示例

Declare @YourTable Table ([id] varchar(50),[name] varchar(50),[value] varchar(50))  
Insert Into @YourTable Values 
 (1,'a,b','12,34')
 
Select ID
      ,Name  = max(case when Item='Name'  then B.Value end)
      ,Value = max(case when Item='Value' then B.Value end)
From @YourTable A
Cross Apply (
                Select [Key]
                      ,Item = 'Name'
                      ,Value
                 From  OpenJSON( '["'+replace(replace([name],'"','\"'),',','","')+'"]' )
                Union All
                Select [Key]
                      ,Item = 'Value'
                      ,Value
                 From  OpenJSON( '["'+replace(replace([value],'"','\"'),',','","')+'"]' )

             ) B
 Group By ID,[Key]

结果

ID  Name    Value
1   a       12
1   b       34

【讨论】:

  • john:这适用于上述场景,但实际上我有 10 列的值由分隔符分隔
  • @Babyboy 它仍然可以工作......您只需要再添加 8 个 UNION ALL。它会变得有点难看,但设计缺陷总是会受到惩罚。
【解决方案2】:

一种方法是递归 CTE:

with cte as (
      select id, convert(varchar(max), null) as name, convert(varchar(max), null) as val, 
             convert(varchar(max), names + ',') as names, convert(varchar(max), vals + ',') as vals
      from t
      union all
      select id,
             convert(varchar(max), left(names, charindex(',', names) - 1)),
             convert(varchar(max), left(vals, charindex(',', vals) - 1)),
             convert(varchar(max), stuff(names, 1, charindex(',', names), '')),
             convert(varchar(max), stuff(vals, 1, charindex(',', vals), ''))
      from cte
      where names like '%,%' and vals like '%,%'
     )
select id, name, val
from cte
where name is not null;

Here 是一个 dbfiddle。

【讨论】:

    猜你喜欢
    • 2018-03-28
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多