如何在Sql中以特定方式格式化字符串

时间:2016-12-14 22:03:17

标签: sql sql-server tsql split

我有一个代表版本的SQL(SQL Server 2016)列。这是NVARCHAR。我想以一致的格式显示列。我对FORMAT做了一些研究,但无法找到解决方案。有什么指示吗?

输出应始终为以下形式:XX.XX.XXXX

您可以假设在第一个小数点之前有两位数字(我可以使用CASE来修复它)

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

Desired Output
==============
13.00.1221
11.00.1111

2 个答案:

答案 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

答案 1 :(得分: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  ......