如何在 CASE 语句中使用 "BETWEEN"

How to use "BETWEEN" in CASE statement

我创建了一个标量函数,可以将学生的分数转换为字母,我使用 CASE & Between 来切换值,如下所示:

ALTER FUNCTION [GetLetterGrade] 
(
    @avg decimal ,
    @isCommented bit
)
RETURNS Char(50)
AS
BEGIN
return case WHEN @isCommented = 0   THEN    
            CASE
            when @avg between 97 And 100 THEN '01'
            when @avg Between  93 And 97 THEN '02'
            when @avg Between  90 And 93 THEN '03'
            when @avg Between  87 And 90 THEN '04'
            when @avg Between  83 And 87 THEN '05'
......

函数在 96.5 而不是 97 和 92.5 而不是 93 上从一种情况跳到另一种情况,等等,知道吗?

[]

请帮忙

小数的默认小数位是 0,因此在函数调用中进行了舍入。

此外,您不需要 between,因为 case 条件是有序的。所以,我建议尝试:

ALTER FUNCTION [GetLetterGrade] (
    @avg decimal(10, 2) ,
    @isCommented bit
) RETURNS Char(50)
AS BEGIN
    return (case when @isCommented = 0     
                 then (case when @avg >= 97 then '01'
                            when @avg >= 93 then '02'
                            when @avg >= 90 then '03'
                            when @avg >= 87 then '04'
                            when @avg >= 83 then '05'
             ......
END;

你可以试试下面的方法

return case WHEN @isCommented = 0   
                THEN  (  
                CASE
                when @avg >=97 And @avg <=100 THEN '01'
                when @avg >=93 And @avg <97 THEN '02'
                when @avg >= 90 And @avg < 93 THEN '03'
                when @avg >=  87 And @avg < 90 THEN '04'
                when @avg >=  83 And @avg < 87 THEN '05'

根据docs,表达式expr BETWEEN min AND max 等价于(expr <= max AND expr >= min) 只有当所有三个参数都是同一类型时。否则类型转换应用于所有参数。在此转换期间会发生舍入错误。

对于您的情况,我建议使用 FLOOR.

向下舍入

when FLOOR(@avg) between 97 And 100 THEN '01'