【问题标题】:How to format a string in a particular way in Sql如何在Sql中以特定方式格式化字符串
【发布时间】:2016-12-14 22:03:17
【问题描述】:

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

【问题讨论】:

  • 您能发布您的查询吗?它有什么问题?
  • 您正在修剪、填充,并且可能还需要其他东西。这应该在应用程序端恕我直言。
  • 你能在你的列中显示更多可能的值吗?
  • 这对我来说有不当规范化的迹象。我有一种感觉,这是将 4 个值塞进一列。诸如软件版本之类的东西太频繁地获得这种类型的非规范化结构。而不是主要、次要、发布、修订的单独列,它们被塞进一列,然后提取它变得很痛苦。

标签: sql sql-server tsql split


【解决方案1】:
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

【讨论】:

  • 谢谢!我发布的两个示例值代表了我面临的“问题”值:(同意规范化评论 --- 不幸的是,这是我必须处理的遗留问题,不能将值拆分为单独的列(此时)
  • @syzygy78 乐于助人
  • @syzygy78 作为记录,我继承的要差得多。 :)
【解决方案2】:

输出的格式应始终为: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  ......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多