在SQL Server中从十进制中删除尾随零

aba*_*hev 77 sql t-sql formatting decimal sql-server-2008

我有一个列,DECIMAL(9,6)即它支持像999,123456这样的值.

但是当我插入像123,4567这样的数据时,它变成了123,456700

如何删除那些零?

And*_*mar 136

A decimal(9,6)在逗号右侧存储6位数字.是否显示尾随零是格式化决策,通常在客户端实现.

但是由于SSMS格式float没有尾随零,您可以通过将其decimal转换为 float以下内容来删除尾随零:

select 
    cast(123.4567 as DECIMAL(9,6))
,   cast(cast(123.4567 as DECIMAL(9,6)) as float)
Run Code Online (Sandbox Code Playgroud)

打印:

123.456700  123,4567
Run Code Online (Sandbox Code Playgroud)

(我的小数点分隔符是一个逗号,但SSMS使用点格式化十进制.显然是一个已知问题.)

  • +1我认为转换为浮动会给结果带来一些不精确但它似乎工作得非常好. (8认同)
  • 加上浮动通常是存储数字的一个非常糟糕的选择.你会得到舍入错误,因为它不是一个确切的类型.切勿使用浮球. (3认同)
  • 此方法的一个缺点是,如果您从“2.0”开始,它会将其变成“2”。对于提出问题的人来说这可能没问题,但我需要能够在小数点后保留一个零,而不保留任何其他尾随零。@user1959416 的答案解决了这个问题。 (2认同)

rob*_*rt4 29

您可以使用该FORMAT()功能(SqlAzure和Sql Server 2012+):

SELECT FORMAT(CAST(15.12     AS DECIMAL(9,6)), 'g18')  -- '15.12'
SELECT FORMAT(CAST(0.0001575 AS DECIMAL(9,6)), 'g10')  -- '0.000158'
SELECT FORMAT(CAST(2.0       AS DECIMAL(9,6)), 'g15')  -- '2'
Run Code Online (Sandbox Code Playgroud)

使用FLOAT(或REAL)时要小心:不要使用g17或更大(或者g8使用REAL更大),因为机器表示的有限精度会导致不必要的影响:

SELECT FORMAT(CAST(15.12 AS FLOAT), 'g17')         -- '15.119999999999999'
SELECT FORMAT(CAST(0.9 AS REAL), 'g8')             -- '0.89999998'
SELECT FORMAT(CAST(0.9 AS REAL), 'g7')             -- '0.9'
Run Code Online (Sandbox Code Playgroud)

此外,请注意,根据文件:

FORMAT依赖于.NET Framework公共语言运行时(CLR)的存在.此功能不会被远程控制,因为它取决于CLR的存在.远程处理需要CLR的函数会导致远程服务器出错.

也适用于SqlAzure.


Bat*_*mer 17

SELECT CONVERT(DOUBLE PRECISION, [ColumnName])
Run Code Online (Sandbox Code Playgroud)

  • 当数字类似于“123.10705000000”时会发生什么?我尝试使用 SELECT CONVERT(DOUBLE PRECISION,123.10705000000) 但它给了我“123.107”作为答案。我想要“123.10705”作为输出?有什么办法吗?我不想使用 CHARINDEX。 (2认同)

Cai*_*ard 10

我不愿意转为浮动,因为我的十进制数字可能比浮点数更多

FORMAT 当与标准.net格式字符串'g8'一起使用时,如果小数字非常小(例如1e-08),则返回科学记数法,这也是不合适的

使用自定义格式字符串(https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings)让我实现了我想要的目标:

DECLARE @n DECIMAL(9,6) =1.23;
SELECT @n
--> 1.230000
SELECT FORMAT(@n, '0.######')
--> 1.23
Run Code Online (Sandbox Code Playgroud)

如果您希望您的号码至少有一个尾随零,那么2.0不会变为2,请使用格式字符串 0.0#####

小数点是本地化的,因此使用逗号作为小数分隔符的文化将遇到逗号输出.是

当然,这是让数据层进行格式化的不可行的做法(但在我的情况下,没有其他层;用户实际上是在运行存储过程并将结果放入电子邮件中:/)

  • 是的,这是唯一允许完全控制小数点分隔符右侧的数字,同时避免使用科学记数法的解决方案。此解决方案的唯一问题是 FORMAT 确实(!)慢。(仍然..关于SQL2019) (2认同)

小智 6

SELECT REVERSE(ROUND(REVERSE(2.5500),1))
Run Code Online (Sandbox Code Playgroud)

打印:

2.55
Run Code Online (Sandbox Code Playgroud)

  • @MasonG.Zhwiti我怀疑这会使用一些十进制小数点后的数字,如232.33220003200,例如: - ) (4认同)
  • 此方法的好处在于,如果只有零,它将留下尾随的零。因此2.5500返回2.55,而2.000返回2.0而不是2。非常适合在车辆中格式化发动机尺寸时... (2认同)

小智 6

尝试这个 :

SELECT REPLACE(TRIM(REPLACE(20.5500, "0", " ")), " ", "0")
Run Code Online (Sandbox Code Playgroud)

给出 20.55

  • REPLACE(TRIM(REPLACE(20.00, "0", " ")), " ", "0") 留下一个尾随 . =>“20。” (2认同)

小智 5

Cast(20.5500 as Decimal(6,2))
Run Code Online (Sandbox Code Playgroud)

应该这样做。