【问题标题】:MS SQL Server: advanced substring, splitting one string column to multimle columnsMS SQL Server:高级子字符串,将一个字符串列拆分为多列
【发布时间】:2017-02-17 03:56:58
【问题描述】:

我在表格中有一个列,我想将内容分成不同的列,破折号的位置并不总是相同的。请提供更简单的代码。

谢谢。

       COL1
AGH-WH6X-23-4534-OPDQE-QADF  
xxx-xxxx-xxxx-xxxx-xxx-xxxx    
xxx-xxxx-xxxxxx-xxxx-xxxxx-xx 
x-xx-xxxx-xxxxxx-xxxx-xxx-xx    
xxx-xx-xxxx-xxxx-xxx-xxx-x 
xxx-xxxx-xxxxxx-xxxxxx-xxx-xx    
x-xxx-xxxx-xxxx-xxxxxx-xxx-xx 
xxx-xxxxx-xxxx-xxxxxx-xxx-xx

期望:

COL2  COL3  COL4  COL5  COL6   COL7
AGH   WH6X  23    4534  OPDQE  QADF
xxx   xxxx  xxxx  xxxx  xxx    NULL

【问题讨论】:

  • 您的问题是什么?样本数据期望的结果会很有帮助。如果你想在 SQL Server 中拆分一个字符串,你可能想谷歌“sql server split”。
  • @GordonLinoff,我有一个有效的查询,只是想知道它是否可以通过更简单的查询来完成。

标签: sql sql-server substring


【解决方案1】:

一种方法是带有聚合的递归 CTE:

with cte as (
      select col1, left(col1, charindex('-', col1 + '-') - 1) as val,
             1 as level,
             substring(col1, charindex('-', col1) + 1, len(col1)) as rest
      from t
      union all
      select col1, left(rest, charindex('-', rest + '-') - 1),
             level + 1,
             substring(rest, charindex('-', rest + '-') + 1, len(col1))
      from cte
      where rest > ''
     )
select max(case when level = 1 then val end) as val1,
       max(case when level = 2 then val end) as val2,
       max(case when level = 3 then val end) as val3,
       max(case when level = 4 then val end) as val4,
       max(case when level = 5 then val end) as val5,
       max(case when level = 6 then val end) as val6,
       max(case when level = 7 then val end) as val7
from cte
group by col1;

【讨论】:

  • @GordonLinoff,此查询需要太多时间来运行大型表。有什么办法可以优化吗,谢谢。
  • @JavlonIsmatov 。 . .您可能想问另一个问题,包括样本数据、期望的结果和参考这个问题。这个想法是:“这段代码有效,但我想让它更快”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
相关资源
最近更新 更多