如何在没有不必要的零的情况下显示可空的十进制值?

时间:2018-01-12 00:30:19

标签: sql sql-server

我有一张如下表:

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   

3 个答案:

答案 0 :(得分:1)

如果您想将NULL值保持为NULL,则只需删除ISNULL()

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

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

答案 1 :(得分:1)

你无法做到这一点,因为你在回合时将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 Fiddle

我只是使用一些强力字符串操作来查找小数并以这种方式回合

答案 2 :(得分:0)

你应该

  1. ROUND()到2位小数
  2. 然后CAST()到字符串
  3. 跟随ISNULL()将NULL转换为空字符串
  4. 查询:

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