Если у вас уже есть способ распределения содержимого «нормальной» строки между столбцами, и вам нужно только решение для расширения строк, таких как ab2e
, в строки, такие как ab<i>[space][space]</i>e
, то вот возможное решение:
DECLARE @InputString varchar(100), @pos int, @result varchar(100);
SET @InputString = 'a2t1y';
SET @result = @InputString;
SET @pos = PATINDEX('%[0-9]%', @result);
WHILE @pos <> 0 BEGIN
SET @result = STUFF(@result, @pos, 1, SPACE(SUBSTRING(@result, @pos, 1)));
SET @pos = PATINDEX('%[0-9]%', @result);
END
SELECT @result;
Вывод:
---------------------
a t y
Вероятно, было бы неплохо реализовать его как функцию:
CREATE FUNCTION ExpandString (@String varchar(100))
RETURNS varchar(100)
AS BEGIN
DECLARE @pos int, @result varchar(100);
SET @result = @String;
SET @pos = PATINDEX('%[0-9]%', @result);
WHILE @pos <> 0 BEGIN
SET @result = STUFF(@result, @pos, 1, SPACE(SUBSTRING(@result, @pos, 1)));
SET @pos = PATINDEX('%[0-9]%', @result);
END
RETURN @result;
END
, чтобы вы могли вызывать его в столбце, напримерthis:
SELECT …, dbo.ExpandString(t.SomeColumn), …
Следует отметить, однако, что это решение поддерживает только однозначные «макросы», то есть a12b
будет преобразован в a<i>[1 space][2 spaces]</i>b
с помощью этой функции, что не обязательновы ожидаете.Итак, если вам нужно, чтобы он распознавал целые числа как последовательности числовых символов между нечисловыми значениями, вот альтернативное решение:
CREATE FUNCTION ExpandString (@String varchar(100))
RETURNS varchar(100)
AS BEGIN
DECLARE @pos int, @lastpos int, @len int, @isnum bit,
@sub varchar(100), @result varchar(100);
SET @result = '';
SET @pos = 1;
SET @len = LEN(@String);
SET @isnum = ISNUMERIC(SUBSTRING(@String, @pos, 1));
WHILE @pos <= @len BEGIN
SET @lastpos = @pos;
WHILE @pos <= @len AND ISNUMERIC(SUBSTRING(@String, @pos, 1)) = @isnum
SET @pos = @pos + 1;
SET @sub = SUBSTRING(@String, @lastpos, @pos - @lastpos);
SET @result = @result + CASE @isnum WHEN 1 THEN SPACE(@sub) ELSE @sub END;
SET @isnum = @isnum ^ 1;
END;
RETURN @result;
END
Обе версии распознают числа как в начале, так и в конце входной строки.