SQL案例上限怪异结果

问题描述 投票:0回答:1

谁能帮我理解为什么case语句([case test v1])是这样的?

select  
case when 0.510 <= 0.5 then '.5' end as [.5 test]
,case when 0.510 <= 0.75 then '.75' end as [.75 test]
,case when 0.510 <= 1 then '1' end as [1 test]
,CEILING(0.510 /.5)*.5 as [ceiling test]
,case 
    when 0.510 <= 0.5 then '.5'
    when 0.510 <= 0.75 then '.75'
    when 0.510 <= 1 then '1'
    else CEILING(0.510 /.5)*.5 
end as [case test v1]
,case 
    when 0.510 <= 0.5 then '.5'
    when 0.510 <= 0.75 then '.75'
    when 0.510 <= 1 then '1'
    --else CEILING(0.510 /.5)*.5 
end as [case test v2]

以下是结果

[.5 测试] = NULL [.75 测试] = .75 [1 测试] = 1 [上限测试] = 1 [case test v1] = 0.8 [case test v2] = .75

为什么[case test v1]显示的结果是0.8......当我注释掉其中的else语句时,它的工作原理和预期一样,显示0.75(见[case test v2])。

我希望通过这个案例得到的结果是在这些组中显示数据.5, .75, 1 (然后以0.5为单位递增), 所以1.5, 2, 2.5, 3, 3.5等。

PS,0.510的值只是一个例子,在现实中,我将使用的列中的值是变化的

谢谢

sql sql-server
1个回答
4
投票

因为 CEILING(0.510 /.5)*.5 返回一个数据类型为 numeric(9,1).

这有最高的数据类型优先权,所以被用作表达式的结果,当字符串被隐式地投向它时,你会得到四舍五入。

为什么你在其他分支中使用字符串?如果你使用 .75 SQL Server会看到,它需要为规模保留两个位置,如下图所示(现在返回 numeric(10,2)).

select  
case 
    when 0.510 <= 0.5 then .5
    when 0.510 <= 0.75 then .75
    when 0.510 <= 1 then 1
    else CEILING(0.510 /.5)*.5 
end as [case test v1]

如果有一些合理的理由需要使用字符串,你需要明确地投下 numeric 分支为字符串--如以下所示

select  
case 
    when 0.510 <= 0.5 then '.5'
    when 0.510 <= 0.75 then '.75'
    when 0.510 <= 1 then '1'
    else CAST(CEILING(0.510 /.5)*.5 AS VARCHAR(10))
end as [case test v1]
© www.soinside.com 2019 - 2024. All rights reserved.