如果我输入如下给出的字符串,我应该能够如下所述进行转换。
例1:字符串 - 5AB89C应转换为0000000005AB0000000089C
例2:字符串GH1HJ应转换为GH0000000001HJ
例3:字符串N99K7H45应为B0000000099K0000000007H0000000045
每个数字都应该包含10个前导零,包括数字。在Ex:1中,数字5补充了9个前导零,产生10个数字,同样的方式89补充了8个前导零,总共10个数字。字母和任何特殊字符都应该不受影响。
一旦你得到PatternSplitCM的副本这很容易就像馅饼。
以下是我们如何用一个值来做到这一点:
DECLARE @string VARCHAR(8000) = '5AB89C'
SELECT CASE f.[matched] WHEN 1 THEN '00000000'+'' ELSE '' END + f.item
FROM dbo.patternsplitCM(@String,'[0-9]') AS f
ORDER BY f.ItemNumber
FOR XML PATH('');
返回:000000005AB0000000089C
现在反对一个表:
-- sample data
DECLARE @table TABLE (StringId INT IDENTITY, String VARCHAR(8000));
INSERT @table(String)
VALUES('5AB89C'),('GH1HJ'),('N99K7H45');
SELECT t.StringId, oldstring = t.String, newstring = f.padded
FROM @table AS t
CROSS APPLY
(
SELECT CASE f.[matched] WHEN 1 THEN '00000000'+'' ELSE '' END + f.item
FROM dbo.patternsplitCM(t.String,'[0-9]') AS f
ORDER BY f.ItemNumber
FOR XML PATH('')
) AS f(padded);
返回:
StringId oldstring newstring
----------- ----------------- --------------------------------------
1 5AB89C 000000005AB0000000089C
2 GH1HJ GH000000001HJ
3 N99K7H45 N0000000099K000000007H0000000045
......就是这样。创建PatternSplitCM的代码如下。
PatternSplitCM代码:
CREATE FUNCTION dbo.PatternSplitCM
(
@List VARCHAR(8000) = NULL
,@Pattern VARCHAR(50)
) RETURNS TABLE WITH SCHEMABINDING
AS
RETURN
WITH numbers AS (
SELECT TOP(ISNULL(DATALENGTH(@List), 0))
n = ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
FROM
(VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) d (n),
(VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) e (n),
(VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) f (n),
(VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) g (n))
SELECT
ItemNumber = ROW_NUMBER() OVER(ORDER BY MIN(n)),
Item = SUBSTRING(@List,MIN(n),1+MAX(n)-MIN(n)),
Matched
FROM (
SELECT n, y.Matched, Grouper = n - ROW_NUMBER() OVER(ORDER BY y.Matched,n)
FROM numbers
CROSS APPLY (
SELECT Matched = CASE WHEN SUBSTRING(@List,n,1) LIKE @Pattern THEN 1 ELSE 0 END
) y
) d
GROUP BY Matched, Grouper