字符串中 T-SQLpad 前导零,表示字符之间的值"."



我想将字符"."之间的每个数字转换为小数点后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

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

  1. 将字符串拆分为单个数据点。
  2. 将解析后的值转换为所需的格式。
  3. 将新值塞回带分隔符的列表中。

理想情况下,你不应该像这样将多个数据点存储在单个交叉点中,但有时你别无选择。

我正在使用来自Jeff Moden和Sql Server Central社区的字符串分割器,可以在这里找到。/72993/http://www.sqlservercentral.com/articles/Tally +表。有很多其他体面的字符串分离器。这里有一些其他选择的优秀例子。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

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

您没有提到'的数量。的分隔符。我假设,最大值是4,解在下面。

<>之前选择的东西(ISNULL('。' +正确的(‘000’+ PARSENAME (STRVALUE, 4), 4),")+ ISNULL("。' +正确的(‘000’+ PARSENAME (STRVALUE 3)、4),")+ ISNULL("。' +正确的(‘000’+ PARSENAME (STRVALUE, 2), 4),")+ ISNULL("。' +正确的(‘000’+ PARSENAME (STRVALUE, 1), 4),), 1, 1)(值("永久"),(1.2)、(4.0)、(4.3)、(4.10))一个(STRVALUE)

最新更新