格式化sql中的wbs列

时间:2017-08-18 00:18:54

标签: sql sql-server

如何拆分然后使用SQL格式化wbs列以使用前缀为零?

示例:1.2.15至1.002.015

样本WBS列内容:

 - 1.1
 - 1.1.1
 - 1.1.2
 - 1.1.3
 - 1.2

3 个答案:

答案 0 :(得分:0)

不是地球上最美丽的代码,但它可以解决问题:

DECLARE @STR VARCHAR(100) = '1.2.15'
DECLARE @FORMAT VARCHAR(10) = '000'

DECLARE @P1 VARCHAR(10)
DECLARE @P2 VARCHAR(10)
DECLARE @P3 VARCHAR(10)
DECLARE @P4 VARCHAR(10)

DECLARE @PARTS INT = 1 + LEN(@STR) - LEN(REPLACE(@STR, '.', ''))

SELECT @P1 = PARSENAME(@STR, @PARTS)
SELECT @P2 = PARSENAME(@STR, @PARTS - 1) 
SELECT @P3 = PARSENAME(@STR, @PARTS - 2) 
SELECT @P4 = PARSENAME(@STR, @PARTS - 3)

SELECT @P2 = FORMAT(CAST(@P2 AS INT), @FORMAT)
SELECT @P3 = FORMAT(CAST(@P3 AS INT), @FORMAT)
SELECT @P4 = FORMAT(CAST(@P4 AS INT), @FORMAT)

SELECT ISNULL(@P1, '') + ISNULL('.' + @P2, '') + ISNULL('.' + @P3, '') + ISNULL('.' + @P4, '')
-- Output is 1.002.015

关键是使用PARSENAME功能。它用于解析完全限定的SQL对象名称,但在这里我们将它用于WBS。我首先找到要知道它有多少部分的点数,因为该函数的第二个参数是从末尾开始计算的部分。这样我就可以获得@P1中的主要版本,@P2中的下一个版本等。

然后我做了一个添加前导零的技巧,最后我只是连接数字,如果其中一个是NULL,则避免使字符串为空。

<强>限制:

  1. 最多只能有4个部分(不能将其用于1.2.15.6.3)
  2. 必须有效,没有空格,没有。最后

答案 1 :(得分:0)

Declare @wbs nvarchar(MAX)
Set @wbs ='1.1.12.123.1234.12345.123456.1234567.123456789.1234567890'

DECLARE @XML AS XML
DECLARE @delimiter AS CHAR(1) = '.' -- wbs character seperator
SET @XML = CAST(('<WBS>'+REPLACE(@wbs, @delimiter,'</WBS><WBS>')+'</WBS>') AS XML)

DECLARE @tempTable TABLE (ID INT IDENTITY(1, 1) primary key, WBS INT)
INSERT INTO @tempTable SELECT N.value('.', 'INT') AS ID FROM @XML.nodes('WBS') AS T(N)

DECLARE @formattedWbs  varchar(MAX) = '',
        @wbsSplit  INT,
        @id INT,
        @skip bit = 1;

WHILE EXISTS (SELECT * FROM  @tempTable)
BEGIN
    SELECT TOP 1 @wbsSplit = WBS, @id = ID FROM @tempTable;

    IF @skip = 1
        BEGIN
            SET @formattedWbs +=  @wbsSplit;
            SET @skip = 0;
        END
    ELSE
        BEGIN
            SET @formattedWbs += '.' + FORMAT(@wbsSplit,'000#');
        END

    DELETE @tempTable Where ID = @id;
END

PRINT @formattedWbs;

答案 2 :(得分:0)

创建函数GetFormattedWBS(@wbs VARCHAR(MAX)) RETURNS varchar(MAX) 开始     SET @wbs + =&#39;。&#39;

DECLARE @formattedwbs NVARCHAR(MAX);
SET @formattedwbs = '';

WHILE (CHARINDEX('.', @wbs) > 0)
BEGIN
    DECLARE @wbsnode INT;
    SET @wbsnode = SUBSTRING(@wbs, 1, CHARINDEX('.', @wbs) - 1);
    SET @formattedwbs +=  FORMAT(@wbsnode,'00000#') + '.';
    SET @wbs = SUBSTRING(@wbs, CHARINDEX('.', @wbs) + 1, len(@wbs));
END

SET @formattedwbs = SUBSTRING(@formattedWbs, 1, (len(@formattedWbs) - 1));  

RETURN @formattedwbs

END