如何在不带不必要的零的情况下显示可为空的十进制值



我有一个如下表:

CREATE TABLE a
(
    ID INT,
    V DECIMAL(28, 10) NULL
)

INSERT INTO a(ID, V)
VALUES(1, 12.345)
INSERT INTO a(ID)
VALUES(2)

所需的输出类似于

╔════╤═══════╗
║ ID │ V     ║
╠════╪═══════╣
║ 1  │ 12.35 ║
╟────┼───────╢
║ 2  │       ║
╚════╧═══════╝

但是通过这个查询,我得到了第 2 行的 NULL:

SELECT ID, ROUND([V], 2) AS V
FROM a;
ID  V
1   12.3500000000
2   NULL

通过此查询,我为第 2 行添加了不必要的零:

SELECT ID, ROUND(ISNULL(CAST(V AS VARCHAR(50)), ''), 2) AS V
FROM a;
ID  V
1   12.35
2   0

有人可以帮忙吗?数据库是 SQL Server 2005。

更新:

此查询将导致不需要的缩放:

SELECT ID, ISNULL(CAST(ROUND(V, 2) AS VARCHAR(50)), '') AS V
FROM   a;
ID  V
1   12.3500000000
2   

你不能这样做,因为你在舍入时有 V 作为数字

select 1 union select ''

这导致输出

1
0

因此,您需要做的是四舍五入V然后在保持舍入的同时转换为字符串。 说起来容易做起来难:

SELECT ID, case when v is null then '' else left(CAST(ROUND(V,2) AS VARCHAR(50)),charindex('.', CAST(ROUND(V,2) AS VARCHAR(50)))+2) end AS V
FROM a;

SQL 小提琴

我只是使用一些蛮力字符串操作来找到小数并以这种方式四舍五入

如果要将NULL值保留为NULL,则只需删除ISNULL()

SELECT ID, ROUND(CAST(V AS VARCHAR(50)), 2) AS V
FROM a;

如果您知道所需的精度,那么我建议您使用 STR() 或以指定精度转换为小数。

你应该

  1. ROUND(( 到小数点后 2 位
  2. 然后 CAST(( 到字符串
  3. 后跟 ISNULL(( 将 NULL 转换为空字符串

查询:

SELECT ID, ISNULL(CAST(ROUND(V, 2) AS VARCHAR(50)), '') AS V
FROM   a;

最新更新