如何在 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'
我创建了一个标量函数,可以将学生的分数转换为字母,我使用 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'