【问题标题】:Conditionally convert a decimal value to integer有条件地将十进制值转换为整数
【发布时间】:2021-01-08 10:12:30
【问题描述】:
create table #Temp
(
    id int,
    Volume decimal(18,3)
)

insert into #Temp(id,Volume)values(1,10)
insert into #Temp(id,Volume)values(2,10.2)


id  Volume
-----------------
1   10.000
2   10.200


Declare @Type as int
set @Type=1


 select Id,Convert(varchar(10),CASE WHEN @Type=1 THEN CAST(Volume AS INT)
 ELSE Volume  END) AS Quantity from #Temp

它正在显示这样的结果

id  Volume
-----------------
1   10.000
2   10.000

但是当类型为 1 时我想要这样的结果,那么结果应该是整数格式:

id  Volume
-----------------
1   10
2   10

在其他条件下(@Type 而不是 1)我想要这样的结果

    id  Volume
    -----------------
    1   10.000
    2   10.200

我试过这个查询

select Id,Convert(varchar(10),CASE WHEN @Type=1 THEN CAST(Volume AS INT) 
ELSE Volume  END) AS Quantity from #Temp

【问题讨论】:

  • 您需要编写两个单独的查询,并将它们放在IF 后面。 T-SQL 仅允许其列使用静态类型,因此您不能在查询中有条件地切换类型。
  • @Panagiotis Kanavos 它不工作,先生......
  • 什么不起作用?坦率地说,为什么要在服务器上这样做呢?当你返回一个整数时,你实际上是在四舍五入。那么为什么不四舍五入仍然返回小数呢?
  • 这听起来应该是使用表现层来控制显示格式,而不是SQL Server动态改变列的数据类型。
  • 旁注:SQL Server 已经支持一年多了,您应该尽快查看升级路径。

标签: sql sql-server sql-server-2008


【解决方案1】:

这对你有用。

 select Id, (CASE WHEN @Type=1 THEN convert(varchar(10),convert(int,volume))
 ELSE convert(varchar(10),Volume)  END) AS Quantity from #Temp

当@type 为1 时,两个值的结果都是10。否则它将是表中的精确值。

【讨论】:

  • 我真的不喜欢将数值数据作为基于字符串的数据类型返回。字符串和数字数据非常不同。例如,'10' 的值低于'2'。使用数值数据时,返回字符串可能会产生意想不到的结果。
猜你喜欢
  • 1970-01-01
  • 2010-10-16
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
相关资源
最近更新 更多