我有一张如下表:
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
答案 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;
我只是使用一些强力字符串操作来查找小数并以这种方式回合
答案 2 :(得分:0)
你应该
查询:
SELECT ID, ISNULL(CAST(ROUND(V, 2) AS VARCHAR(50)), '') AS V
FROM a;