sql string split для определенного количества символов
У меня есть строка типа "aabbcczx", и мне нужно разделить эту строку на 2 символа. Ожидаемый результат примерно такой:
aabbcczx aa
aabbcczx bb
aabbcczx cc
aabbcczx zx
Как я могу это сделать? Учтите также, что длина строки меняется строка за строкой.
Спасибо
4 ответа
Если это всегда 2 символа:
SELECT A.Val,
CA1.N,
SUBSTRING(A.Val,n,2)
FROM (
VALUES ('aabbcczx')
) AS A(Val)
CROSS
APPLY dbo.GetNums(1,LEN(A.Val)) AS CA1
WHERE CA1.n % 2 = 1;
GetNums - это генератор числовых таблиц / счетных таблиц, вы можете найти несколько источников в Интернете.
Это обеспечит положение каждого персонажа, и мы можем использовать это в substring
стартовая позиция. Предложение where использует MOD
чтобы мы показывали только все остальные стартовые позиции
Вы можете использовать рекурсивный запрос для извлечения пар символов:
with instring as
( select 'aabbcczx' as s )
, splitter as
(
select s, substring(s, 1, 2) as rslt, 3 as next -- first two chars
from instring
union all
select s, substring(s, next, 2), next + 2 -- next two chars
from splitter
where len(s) >= next
)
select *
from splitter
Смотри dbfiddle
Вы можете использовать рекурсивный запрос:
with cte as (
select convert(varchar(max), left(str, 2)) as val2, convert(varchar(max), stuff(str, 1, 2, '')) as rest, str
from (values ( 'aabbcczx' )) v(str)
union all
select left(rest, 2) as val2, stuff(rest, 1, 2, '') as rest, str
from cte
where rest <> ''
)
select str, val2
from cte;
Используйте таблицу подсчета или фактическую таблицу для хорошей производительности:
DECLARE @var varchar(4000) = 'aabbcczx'
;WITH N(N)AS
(
SELECT 1
FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),1))M(N)
),tally(N)AS
(
SELECT ROW_NUMBER()OVER(ORDER BY N.N)
FROM N,N a,N b,N c,N d,N e,N f
)
SELECT top((LEN(@var)+1)/2)
SUBSTRING(@var,N*2-1,2)
FROM tally