查找和替换字符串中的数字

问题描述 投票:0回答:1

如果我输入如下给出的字符串,我应该能够如下所述进行转换。

例1:字符串 - 5AB89C应转换为0000000005AB0000000089C

例2:字符串GH1HJ应转换为GH0000000001HJ

例3:字符串N99K7H45应为B0000000099K0000000007H0000000045

每个数字都应该包含10个前导零,包括数字。在Ex:1中,数字5补充了9个前导零,产生10个数字,同样的方式89补充了8个前导零,总共10个数字。字母和任何特殊字符都应该不受影响。

tsql
1个回答
2
投票

一旦你得到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
© www.soinside.com 2019 - 2024. All rights reserved.