2016-12-14 282 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 ......