Сдвиг строкового значения на SQL сервере - PullRequest
1 голос
/ 06 марта 2020

Не уверен, как четко описать то, что я хотел бы достичь, надеюсь, что мой вопрос ниже имеет какой-то смысл.

Предположим, у меня есть строка 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, но я не уверен, как начать.

Любая помощь будет высоко ценится.

Ответы [ 2 ]

4 голосов
/ 06 марта 2020

Вы можете использовать рекурсивный 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;

Здесь - это скрипта db <>.

0 голосов
/ 06 марта 2020

Попытка без использования Recursive CTE. Будьте осторожны при работе со струнами большого размера, потому что replicate имеет свои ограничения .

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

...