2015-07-20 122 views
-1

我想将数字转换为字符“。”之间每个数字的小数点后3位。例如:T-SQLpad在字符串中为“。”之间的值前导零。字符

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 
+0

4.0124 - >要什么? – Praveen

+0

三个字符是字符之间每个值的最大值。 – maverick1975

+0

Yuck。为什么要在一个单独的区段中存储多个分隔值?这违反了1NF并导致了山脉的痛苦。您必须首先将其解析为每个元素,然后将每个数据点转换为您想要的,并最终再次将它们推回到单个列中。这只是存储数据的错误方法。 –

回答

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) 

1

这是相当容易的,一旦你了解所有的步骤:

  1. 分割字符串到各个数据点。
  2. 将解析的值转换为所需的格式。
  3. 将新值传回到分隔列表中。

理想情况下,您不应该将数据与多个数据点存储在一个像这样的交叉点,但有时您只是别无选择。

我正在使用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

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