输入
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个空格之后。 在第二个输入中,因为没有空格,所以字母将在彼此之后出现
谢谢
答案 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
两个版本都识别输入字符串开头和结尾的数字。