我有一个如下表:
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()
或以指定精度转换为小数。
你应该
- ROUND(( 到小数点后 2 位
- 然后 CAST(( 到字符串
- 后跟 ISNULL(( 将 NULL 转换为空字符串
查询:
SELECT ID, ISNULL(CAST(ROUND(V, 2) AS VARCHAR(50)), '') AS V
FROM a;