2016-12-14 279 views
2

我有一个表示版本的SQL(SQL Server 2016)列。它是NVARCHAR。我想以一致的格式显示该列。我对FORMAT做了一些研究,但找不到解决方案。任何指针?如何在Sql中以特定方式格式化字符串

输出应该永远是这样的形式:XX.XX.XXXX

你可以假设有两个数字的第一小数点前(我能使用CASE用于固定)

Sample Input 
============ 
13.0.1221.00 
11.00.1111 

Desired Output 
============== 
13.00.1221 
11.00.1111 
+0

你能发表您的查询吗?它出什么问题了? –

+3

你正在修整,填充,并可能需要别的东西。这应该在应用程序端恕我直言。 – scsimon

+0

你可以在列中显示更多可能的值吗? –

回答

3
Declare @YourTable table (SomeField varchar(25)) 
Insert Into @YourTable values 
('13.0.1221.00'), 
('11.00.1111') 

Select A.* 
     ,Format(Pos1,'00')+'.'+Format(Pos2,'00')+'.'+Format(Pos3,'0000') 
From @YourTable A 
Cross Apply (
    Select Pos1 = xDim.value('/x[1]','int') 
      ,Pos2 = xDim.value('/x[2]','int') 
      ,Pos3 = xDim.value('/x[3]','int') 
    From (Select Cast('<x>' + Replace(A.SomeField,'.','</x><x>')+'</x>' as XML) as xDim) A 
     ) B 

返回

SomeField  (No column name) 
13.0.1221.00 13.00.1221 
11.00.1111  11.00.1111 
+0

谢谢!我发布的两个示例值代表我正面临的“问题”值:( 同意规范化评论---不幸的是,这是一个遗留问题,我必须处理并且不能将这些值分成单独的列(在这个时候) – syzygy78

+0

@ syzygy78乐于帮忙 –

+1

@ syzygy78为了记录,我遗传得更糟。:) –

0

输出应该永远是这样的形式:XX.XX.XXXX

强制三位数成两个最终会坏我猜想,但如果这些都要求:

Declare @YourTable table (s varchar(25)) 
Insert Into @YourTable values 
('13.0.1221.00'), 
('11.00.1111'), 
('189.256.0000001'), 
('7'), 
('.19.'), 
('13.4.'), 
('..11'), 
('A..B'), 
(null), 
('......') 

;WITH rs AS (SELECT s, REVERSE('0' + s) AS rs FROM @YourTable) 
    SELECT REVERSE(LEFT(ISNULL(PARSENAME(rs, 3), '') + '0000', 4) + '.' + 
        LEFT(ISNULL(PARSENAME(rs, 2), '') + '00' , 2) + '.' + 
        LEFT(ISNULL(PARSENAME(rs, 1), '') + '00' , 2)), s 
    FROM rs 

结果:

13.00.1221 13.0.1221.00 
11.00.1111 11.00.1111 
89.56.0001 189.256.0000001 
07.00.0000 7 
00.19.0000 .19. 
13.04.0000 13.4. 
00.00.0011 ..11 
0A.00.000B A..B 
00.00.0000 NULL 
00.00.0000 ......