【问题标题】:SQL Server: split a column into multiple columns (tabular format)SQL Server:将一列拆分为多列(表格格式)
【发布时间】:2016-11-21 23:02:21
【问题描述】:

我有一个如下所示的表格:

id         actions
ua123      [{'type':'mobile'},{'action':'display conversion'}]
ua234      [{'type':'DT'},{'action':'search'},{'value':'40'}]

为什么这个表格看起来像这样是因为信息是从网站上抓取的。而我想将actions列拆分成几列,比如:

id         actions1                    action2                         action3
ua123      [{'type':'mobile'}   {'action':'display conversion'}]        Null
ua234      [{'type':'DT'}       {'action':'search'}                {'value':'40'}]

请随时分享任何灯光。谢谢!

【问题讨论】:

    标签: sql-server split


    【解决方案1】:

    假设您不想要动态。 (如有需要,可稍作改动)

    Select A.ID
          ,B.*
     From  YourTable A
     Cross Apply (
                    Select actions1 = xDim.value('/x[1]','varchar(max)')
                          ,actions2 = '{'+xDim.value('/x[2]','varchar(max)')
                          ,actions3 = '{'+xDim.value('/x[3]','varchar(max)')
                     From (Select Cast('<x>' + Replace(A.Actions,',{','</x><x>')+'</x>' as XML) as xDim) A
                 ) B
    

    返回

    ID       actions1           actions2                            actions3
    ua123   [{"type":"mobile"}  {"action":"display conversion"}]    NULL
    ua234   [{"type":"DT"}      {"action":"search"}                {"value":"40"}]
    

    【讨论】:

    • 感谢您的回答。但是,当我在上面运行您的代码时。消息显示“找不到数据类型'XML'”。我发现为什么会发生这种情况的一个答案是 XML 似乎只是在 2005/2008 sql server 下兼容,而我使用的是 2016。然而,当我将脚本版本更改回 2005/2008 时,它仍然无法正常工作。有什么想法吗?
    • @ZedFang XML 自 2005 版以来可用。我简直无法想象错误来自哪里。我会再挖一点。
    • 听起来不错。无论如何,您上面使用的解决方案仅适用于最多三个',{'的原始列。但是,如果我不知道每行中有多少',{',我如何根据每行本身自动将这些列分成几列?我习惯在postgresql下使用split_part,它会自动检测分隔符。我也不相信sql server有这个功能。
    • @ZedFang 如果您需要动态,这个问题还不清楚。但是,将 cross apply 扩展为 10 可能更容易。只需复制 actions3 行并将等号两侧的 3 更改为 4。
    • 我知道为什么你的语法不能更早地工作。这是因为我的数据位于 Views 下。我相信您的语法适用于大多数 SQL 服务器案例。再次感谢
    【解决方案2】:

    @johncappelletti 谢谢你的回答,给了我一些启发!

    这是我用来解决问题的最终语法。

    Declare @delimiter varchar(50)
    set @delimiter=' ';
    
    With Test1 as 
    (Select id,
            actions,
            cast('<x>'+replace(actions,@delimiter,'<x></x>')+'</x>' as XML)
            as Name_XML
     From tb1
    )
    Select id,
           actions,
           Name_XML.value('/x[1]','varchar(50)') as action1,
           Name_XML.value('/x[2]','varchar(50)') as action2,
           Name_XML.value('/x[3]','varchar(50)') as action3,
           Name_XML.value('/x[4]','varchar(50)') as action4,
             .
             .
             .
             .
    From Test1
    

    【讨论】:

      猜你喜欢
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2020-02-10
      相关资源
      最近更新 更多