Как создать пробелы между буквами в Sql Server 2005 (Set Based) - PullRequest
0 голосов
/ 15 июня 2011

Ввод

Column
ab2e
mnop
a2t1y

вывод

Id  Col1 Col2 Col3 Col4 Col5  Col6
1    a    b              e
2    m    n    o     p
3    a               t        y

Цифры обозначают количество пробелов, поскольку в первом входе есть2 после b, поэтому буква e появится после 2 пробелов от b.Во втором вводе, так как нет места, буквы будут появляться после друг друга

Спасибо

1 Ответ

1 голос
/ 15 июня 2011

Если у вас уже есть способ распределения содержимого «нормальной» строки между столбцами, и вам нужно только решение для расширения строк, таких как 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

Обе версии распознают числа как в начале, так и в конце входной строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...