【问题标题】:MS Sql Splitting Specific column by sub stringMS Sql 按子字符串拆分特定列
【发布时间】:2020-11-14 05:38:37
【问题描述】:

我正在尝试编写一个查询来按子字符串拆分和连接特定列。不知道如何实现它

    Create table #tmp1
    (
    ID bigint,
    Code  varchar(10)
    )
    insert into #tmp1 values(1,'')
    insert into #tmp1 values(2,'DCBA')
    insert into #tmp1 values(3,'BACD')
    insert into #tmp1 values(4,'ABCD')
    select * from #tmp1
    select
    ID,
    * from #tmp1 a

我希望我的最终结果为

1   
2   DCBA    D   1
2   DCBA    C   2
2   DCBA    B   3
2   DCBA    A   4
3   BACD    B   1
3   BACD    A   2
3   BACD    C   3
3   BACD    D   4
4   ABCD    A   1        
4   ABCD    B   2    
4   ABCD    C   3 
4   ABCD    D   4 

我已经尝试过 sql 子字符串,但无法完成它

【问题讨论】:

  • 对不起类型,现在编辑

标签: sql sql-server split substring


【解决方案1】:

递归 CTE 可能是最简单的解决方案:

with cte as (
      select id, code, stuff(code, 1, 1, '') as rest, left(code, 1) as letter, 1 as lev
      from #tmp1
      union all
      select id, code, stuff(rest, 1, 1, '') as rest, left(rest, 1) as letter, lev + 1
      from cte
      where rest <> ''
     )
select id, code, letter, lev
from cte;

Here 是一个 dbfiddle。

其实这里有一个稍微简单一点的版本:

with cte as (
      select id, code, left(code, 1) as letter, 1 as lev
      from tmp1
      union all
      select id, code, substring(code, lev, 1) as letter, lev + 1
      from cte
      where lev < len(code)
     )
select id, code, letter, lev
from cte;

【讨论】:

  • 第一个查询有效,第二个查询准确。感谢 cte as (select id, code, stuff(code, 1, 1, '') as rest, left(code, 1) as letter, 1 as lev from #tmp1 union all select id, code, stuff (rest, 1, 1, '') as rest, left(rest, 1) as letter, lev + 1 from cte where rest '') select id, code, letter, lev from cte order by id,code,列弗;
  • @Dilip 。 . .如果您的字符串超过 100 个字符,则需要添加 OPTION (MAXRECURSION 0)
猜你喜欢
  • 2015-12-18
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 2023-03-23
  • 2014-07-22
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多