【问题标题】:SQL - Split string to columns by multiple delimitersSQL - 通过多个分隔符将字符串拆分为列
【发布时间】:2018-09-03 20:42:25
【问题描述】:

这个问题似乎有很多解决方案,但是我的解决方案需要是动态的,因为分隔符的数量在 0 到 3 之间变化,并且需要相对高效,因为它将在 5 个循环中跨 >10m 行运行。

例如:

  US

  US-AL

  US-AL-Talladega

  US-AL-Talladega-35160

如果信息不在字符串中,解决方案需要能够将每个项目存放在国家、州、县、ZIP 字段中,并带有 NULL 字段。

任何关于最佳方法的 cmet 将不胜感激,甚至向我指出我可能错过解决方案的方向将不胜感激

【问题讨论】:

  • 或任何其他语言,但我坚持使用 SQL Server 来解决此问题。多个子字符串/字符索引组合是我正在研究的当前解决方案,但它绝不是最有效的!
  • SQL Server 的哪个版本?
  • 发布您正在使用的代码。

标签: sql sql-server string delimiter


【解决方案1】:

另一种选择是将一点 XML 与 CROSS 或 OUTER APPLY 配合使用

示例

Declare @YourTable table (YourCol varchar(100))
Insert Into @YourTable values
 ('US')
,('US-AL')
,('US-AL-Talladega')
,('US-AL-Talladega-35160')

Select A.* 
      ,B.*
 From @YourTable A
 Outer Apply (
                Select Country = xDim.value('/x[1]','varchar(max)')
                      ,State   = xDim.value('/x[2]','varchar(max)')
                      ,County  = xDim.value('/x[3]','varchar(max)')
                      ,ZIP     = xDim.value('/x[4]','varchar(max)')
                From  (Select Cast('<x>' + replace(YourCol,'-','</x><x>')+'</x>' as xml) as xDim) as A 
             ) B

返回

YourCol                 Country State   County      ZIP
US                      US      NULL    NULL        NULL
US-AL                   US      AL      NULL        NULL
US-AL-Talladega         US      AL      Talladega   NULL
US-AL-Talladega-35160   US      AL      Talladega   35160

【讨论】:

    【解决方案2】:

    您将需要一个分隔分隔符。喜欢DelimitedSplit8K 来自http://www.sqlservercentral.com/articles/Tally+Table/72993/

    ; with tbl as
    (
        select  col = 'US'          union all
        select  col = 'US-AL'           union all
        select  col = 'US-AL-Talladega'     union all
        select  col = 'US-AL-Talladega-35160'
    )
    select  t.col,
            max(case when ItemNumber = 1 then Item end) as Country,
            max(case when ItemNumber = 2 then Item end) as State,
            max(case when ItemNumber = 3 then Item end) as County,
            max(case when ItemNumber = 4 then Item end) as Zip
    from    tbl t
            cross apply dbo.[DelimitedSplit8K](t.col, '-')
    group by t.col
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-13
      • 2013-10-30
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      相关资源
      最近更新 更多