如何在Sql Server 2005中生成字母之间的空格(基于集)

时间:2011-06-15 04:34:57

标签: sql-server-2005 tsql

输入

Column
ab2e
mnop
a2t1y

输出

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

数字表示空格数 由于在第一个输入中,b之后有2个,因此字母e将出现在b之后的2个空格之后。 在第二个输入中,因为没有空格,所以字母将在彼此之后出现

谢谢

1 个答案:

答案 0 :(得分:1)

如果您已经有了在列之间分发“普通”字符串内容的方法,并且只需要一个解决方案来将ab2e等字符串扩展为ab[space][space]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

所以你可以在这样的列上调用它:

SELECT …, dbo.ExpandString(t.SomeColumn), …

但应该注意的是,此解决方案仅支持单位“宏”,即a12b将使用此函数转换为a[1 space][2 spaces]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

两个版本都识别输入字符串开头和结尾的数字。