字符串中的T-SQLpad前导零,表示“。”之间的值。字符

时间:2015-07-20 13:18:55

标签: sql sql-server

我想将数字转换为字符“。”之间每个数字的3位小数。例如:

1.1.5.2 -> 001.001.005.002
1.2 -> 001.002
4.0 -> 004.000
4.3 ->004.003
4.10 -> 004.010

这是我的疑问:

SELECT ItemNo
FROM EstAsmTemp

3 个答案:

答案 0 :(得分:1)

一旦理解了所有步骤,这就相当容易了:

  1. 将字符串拆分为各个数据点。
  2. 将解析后的值转换为您想要的格式。
  3. 将新值推回到分隔列表中。
  4. 理想情况下,您不应该将具有多个数据点的数据存储在这样的单个交叉点中,但有时您别无选择。

    我正在使用Jeff Moden的字符串拆分器和Sql Server Central的社区,可以在这里找到。 http://www.sqlservercentral.com/articles/Tally+Table/72993/。还有很多其他像样的字符串分离器。以下是其他选项的一些很好的例子。 http://sqlperformance.com/2012/07/t-sql-queries/split-strings

    在您的生产系统中使用之前,请确保您已理解此代码,因为您将在凌晨3点接到电话,要求将其修复。

    with something(SomeValue) as
    (
        select '1.1.5.2' union all
        select '1.2' union all
        select '4.0' union all
        select '4.3' union all
        select '4.10'
    )
    , parsedValues as
    (
        select SomeValue
            , right('000' + CAST(x.Item as varchar(3)), 3) as NewValue
            , x.ItemNumber as SortOrder
        from something s
        cross apply dbo.DelimitedSplit8K(SomeValue, '.') x
    )
    
    select SomeValue
        , STUFF((Select '.' + NewValue
                from parsedValues pv2
                where pv2.SomeValue = pv.SomeValue
                order by pv2.SortOrder
                FOR XML PATH('')), 1, 1, '') as Details
    from parsedValues pv
    group by pv.SomeValue
    

答案 1 :(得分:1)

根据Zohar Peled的评论,我决定在表示层更改它。

答案 2 :(得分:0)

你没有提到'的数量。'列可以有分隔符。我假设,最大值为4,解决方案在下面。

SELECT STUFF(ISNULL('.' + RIGHT('000' + PARSENAME(STRVALUE,4),4),'') + ISNULL('.' + RIGHT('000' + PARSENAME(STRVALUE,3),4) ,'') + ISNULL('.' + RIGHT('000' + PARSENAME(STRVALUE,2),4) ,'') + ISNULL('.' + RIGHT('000' + PARSENAME(STRVALUE,1),4),''),1,1,'')
FROM (VALUES('1.1.5.2'), ('1.2'), ('4.0'),('4.3'), ('4.10')) A (STRVALUE)