2011-06-15 29 views
-1

输入如何生成字母之间的空间在SQL Server 2005(基于集)

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个空格。 在第二输入,因为没有空间时,这些字母将对方

感谢

+2

如果您有一组数据,您只能以基于集合的方式进行操作。大量的数据行。字符串操作是**不是**基于集合的操作,而不是SQL Server非常擅长的... – 2011-06-15 04:56:20

+0

我想你应该看看这个TSQL挑战http://beyondrelational.com/puzzles/tsql/ 58 /英语/游戏棋,在-TSQL部分-1.aspx。我想这个问题的最佳解决方案将在挑战结束后发布。也许你可以使用的东西。 – 2011-06-15 09:22:46

+1

@Mikael:我确定OP [已经认识](http://stackoverflow.com/questions/6304734/doubt-in-creating-a-sierpinski-carpet-using-tsql-set-based)与该网站。 – 2011-06-15 12:25:18

回答

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这个函数,这不一定是你所期望的。所以,如果你需要认识到整数作为非NUMERICS之间的数字字符序列,这里是一个替代的解决方案:

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 

两个版本都在开始和在输入字符串的结尾认识数字。

+0

这很好..但如何在基于集合 – agnihotri 2011-06-15 10:08:37

+0

@agnihotri:究竟应该基于set-based? – 2011-06-15 12:26:38

相关问题