GaussDB case when条件表达式用法
        【摘要】 在 GaussDB 中,CASE WHEN 是一种条件表达式,用于根据不同的条件返回不同的值。它类似于编程语言中的 if-else 或 switch-case 逻辑,常用于 SQL 查询中对数据进行分类、转换或计算。以下是其用法的详细介绍: 1. 基本语法GaussDB 支持两种 CASE WHEN 格式: (1) 简单 CASE 表达式CASE 列名  WHEN 条件值1 THEN 返回值...
    
    
    
    在 GaussDB 中,CASE WHEN 是一种条件表达式,用于根据不同的条件返回不同的值。它类似于编程语言中的 if-else 或 switch-case 逻辑,常用于 SQL 查询中对数据进行分类、转换或计算。以下是其用法的详细介绍:
1. 基本语法
GaussDB 支持两种 CASE WHEN 格式:
 (1) 简单 CASE 表达式
CASE 列名  WHEN 条件值1 THEN 返回值1  WHEN 条件值2 THEN 返回值2     ...
 ELSE 默认值 END
特点:
- 直接对某一列的值进行匹配。
- 适用于简单的等值判断。
 (2) 搜索 CASE 表达式
CASE  WHEN 条件1 THEN 返回值1  WHEN 条件2 THEN 返回值2     ...
 ELSE 默认值 END
特点:
- 支持更复杂的条件判断(如范围、逻辑运算符等)。
- 类似于编程中的 if-else if-else结构。
2. 使用场景
(1) 数据分类
将某一列的值按规则分类:
SELECT     employee_name,
 CASE department  WHEN 'HR' THEN '人力资源部'  WHEN 'IT' THEN '技术部'  ELSE '其他部门'  END AS department\_category FROM employees;
(2) 动态计算字段
根据条件动态计算新字段:
SELECT     sales_amount,
 CASE  WHEN sales\_amount \> 10000 THEN '高销量'  WHEN sales\_amount BETWEEN 5000 AND 10000 THEN '中销量'  ELSE '低销量'  END AS sales\_level FROM sales;
(3) 用在存储过程中
--输入学号和科目名称,返回对应的平均成绩
create or replace procedure pro_avg_score(id int,coursename varchar(20),avgscore out int)
as
begin
    case when coursename='math' then select avg(math) into avgscore from student where student_id=id;
    when coursename='pysical' then select avg(pysical) into avgscore from student where student_id='id';
    when coursename='art' then select avg(art) into avgscore from student where student_id=id;
    when coursename='music' then select avg(music) avgscore from student where student_id=id;
    end case;
end;
/
--输出绩点
create or replace procedure pro_cal_point(id1 int,coursename varchar(30),point  out float)
as 
begin
    case when coursename='math' then select (case when math<=59 then 0
        when math<=69 then 0.1
        when math<=79 then 0.2
        when math<=89 then 0.3
        when math<=100 then 0.4 else 0.2 end) into point from student  where student_id=id1 limit 1;
    when coursename='pysical' then select (case when pysical<=59 then 0
        when pysical<=69 then 0.1
        when pysical<=79 then 0.2
        when pysical<=89 then 0.3
        when pysical<=100 then 0.4 else 0.2 end) into point from student  where student_id=id1 limit 1;
    when coursename='art' then select (case when art<=59 then 0
        when art<=69 then 0.1
        when art<=79 then 0.2
        when art<=89 then 0.3
        when art<=100 then 0.4 else 0.2 end) into point from student  where student_id=id1 limit 1;
    when coursename='music' then select (case when music<=59 then 0
        when music<=69 then 0.1
        when music<=79 then 0.2
        when music<=89 then 0.3
        when music<=100 then 0.4 else 0.2 end) into point from student  where student_id=id1 limit 1;
    else raise notice 'please input right course name;';
    end case;
end;
/
-- 编写函数,获取成绩绩点,
create or replace function fun_cal_point(id1 int,coursename varchar(30)) returns decimal(10,1) as $$
    declare point decimal(10,1);
    begin
        if coursename = 'math' then
            select (case when math <= 59 then 0
                when math <= 69 then 0.1
                when math <= 79 then 0.2
                when math <= 89 then 0.3
                when math <= 100 then 0.4
                else 0.2 end)
            into point from stu where id=id1;
        elsif coursename = 'art' then
            select (case when art <= 59 then 0
                when art <= 69 then 0.1
                when art <= 79 then 0.2
                when art <= 89 then 0.3
                when art <= 100 then 0.4
                else 0.2 end ) into point from stu where id=id1;
            elsif coursename = 'phy' then
                select (case when phy <= 59 then 0
                    when phy <= 69 then 0.1
                    when phy <= 79 then 0.2
                    when phy <= 89 then 0.3
                    when phy <= 100 then 0.4
                    else 0.2 end) into point from stu where id=id1;
                else raise notice 'please input right course name;';
                end if;
                return point;
        end;
        $$ language plpgsql;
3. 注意事项
- 
END关键字必须存在
 每个CASE表达式必须以END结尾,否则会报语法错误。
- 
条件顺序影响结果 
 GaussDB 按顺序判断条件,一旦满足某个条件,后续条件将不再执行。因此,条件的排列需谨慎(尤其是重叠条件)。
- 
ELSE是可选的
 如果未提供ELSE且所有条件都不满足,CASE表达式会返回NULL。
- 
支持嵌套 
 可以嵌套使用CASE表达式,但需注意逻辑复杂度:SELECT score, 
 CASE WHEN score >= 90 THEN ‘A’ WHEN score >= 80 THEN ‘B’ ELSE CASE WHEN score >= 60 THEN ‘C’ ELSE ‘D’ END END AS grade FROM students;
            【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
                cloudbbs@huaweicloud.com
                
            
        
        
        
        
        - 点赞
- 收藏
- 关注作者
 
             
           
评论(0)