我有一个代表版本的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
答案 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 ......