输入如何生成字母之间的空间在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个空格。 在第二输入,因为没有空间时,这些字母将对方
感谢
输入如何生成字母之间的空间在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个空格。 在第二输入,因为没有空间时,这些字母将对方
感谢
后出现。如果你已经有列,只需要之间分配一个“正常”的字符串的内容的方式扩大像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
两个版本都在开始和在输入字符串的结尾认识数字。
这很好..但如何在基于集合 – agnihotri 2011-06-15 10:08:37
@agnihotri:究竟应该基于set-based? – 2011-06-15 12:26:38
如果您有一组数据,您只能以基于集合的方式进行操作。大量的数据行。字符串操作是**不是**基于集合的操作,而不是SQL Server非常擅长的... – 2011-06-15 04:56:20
我想你应该看看这个TSQL挑战http://beyondrelational.com/puzzles/tsql/ 58 /英语/游戏棋,在-TSQL部分-1.aspx。我想这个问题的最佳解决方案将在挑战结束后发布。也许你可以使用的东西。 – 2011-06-15 09:22:46
@Mikael:我确定OP [已经认识](http://stackoverflow.com/questions/6304734/doubt-in-creating-a-sierpinski-carpet-using-tsql-set-based)与该网站。 – 2011-06-15 12:25:18