【问题标题】:String value shifting in SQL ServerSQL Server 中的字符串值移位
【发布时间】:2020-06-18 15:54:07
【问题描述】:

不确定如何清楚地描述我想要实现的目标,希望我下面的问题确实有意义。

假设我有字符串ABCDE。我想迭代它的长度来创建字符串的移位模式,如下所示

_BCDE,A_CDE,AB_DE,ABC_E,ABCD_

所以我想在所有可能的位置创建所有带有下划线的组合,以便在像

这样的查询中使用它们
DECLARE @WORD AS NVARCHAR(50)
SET @WORD = 'ABCDE'
SELECT position = PATINDEX(CONCAT('%', @WORD, '%'), 'BGHKAGCDEBABIDEKFABCREDNBSALCDEOPL'); 

@WORD 应该是带有_ 的单词。

我觉得这可以使用递归 CTE 来完成,但我不知道如何开始。

任何帮助将不胜感激。

【问题讨论】:

    标签: sql sql-server cursor patindex


    【解决方案1】:

    您可以使用递归 CTE:

    DECLARE @WORD AS NVARCHAR(50);
    SET @WORD = 'ABCDE';
    
    with cte as (
          select 1 as n, @word as word
          union all
          select n + 1, word
          from cte
          where n < len(word)
         )
    select word, stuff(word, n, 1, '_')
    from cte;
    

    Here 是一个 dbfiddle。

    【讨论】:

      【解决方案2】:

      尝试不使用Recursive CTE。不过在处理大字符串时要小心处理,因为replicate 有它的limitations

      with cte1 as (select 'abcde' as txt)
      
      select value, stuff(value, row_number() over (order by value), 1, '_') as permutations
      from cte1
      cross apply string_split(replicate(txt+'.',len(txt+'.')-1),'.')
      where value<>'';
      

      输出

      value   permutations
      abcde   _bcde
      abcde   a_cde
      abcde   ab_de
      abcde   abc_e
      abcde   abcd_
      

      DEMO

      【讨论】:

        猜你喜欢
        • 2012-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多