啃食Oracle:条件分支表达式CASE
![fd41a5b18d19d84cefdefa1c3cc96a6b.png](https://i-blog.csdnimg.cn/blog_migrate/3e75d56344b4618517ee890a89b6fd34.jpeg)
CASE表达式是条件分支表达式,类似于if … elsif …else条件分支语句。常见用法是在select的表达式列表中使用。
以下图示来自于官方文档
![80ef0949763300548266f5bcecaaf7f7.gif](https://i-blog.csdnimg.cn/blog_migrate/9d47463cc7ed72a8199d7750ef639fc0.gif)
上图的文字描述为
CASE { simple_case_expression
| searched_case_expression
}
[ else_clause ]
END
从上述图示和文字描述中可看出CASE表达式以CASE开始条件部分,END结束。ELSE为可选部分,条件部分为必选,条件部分又分为两种情况:
1、简单模式,如下图
![a5e86f56287cf3fc9fb268974f17efa0.gif](https://i-blog.csdnimg.cn/blog_migrate/5efa2914d320b29c598cb7d4ed5b6449.gif)
文字描述为
expr
{ WHEN comparison_expr THEN return_expr }...
所谓简单模式,就是条件判断写在when 前,when后直接接值,如下:
declarea int:=5;begindbms_output.put_line(case a when 1 then 1 when 5 then 5 end);end;
返回结果为5
定义变量a,以a为判定条件,当符合不同的比较值的时候返回then 后面的结果
没有符合结果的时候返回null
declarea int:=2;begindbms_output.put_line(case a when 1 then 1 when 5 then 5 end);end;
返回结果为null
简单模式类似decode表达式
2、条件查询表达式
![2d08938c81f763546cb62f73670d7cfa.gif](https://i-blog.csdnimg.cn/blog_migrate/a597c5fc6bfb38bfc42aa869690dfff2.gif)
文字描述为
{ WHEN condition THEN return_expr }...
条件查询可理解成将条件语句放入到when 子句中,这样可以使用复杂的表达式进行判断,如范围表达式等,如下例子:
declarea int:=7;begindbms_output.put_line(case when a>1 then 1 when a>5 then 5 end);end;
返回结果是1,后面a>5也是符合的,为啥没返回呢,因为找到第一个符合的条件后立即返回,不再向后比较,注意,此处容易犯错!
declarea int:=0;begindbms_output.put_line(case when a>1 then 1 when a>5 then 5 end);end;
返回null,没有符合语句返回null
CASE表达式的ELSE部分
![4c9eed53498d983a4e1d284d10b339ed.gif](https://i-blog.csdnimg.cn/blog_migrate/86ea7f81434b4b1f12e10dbb5d079d22.gif)
文字描述为
ELSE else_expr
注意前面的例子中没加入else的时候针对不符合条件的时候返回null,else子句就是处理例外情况的。
简单模式:
declarea int:=7;begindbms_output.put_line(case a when 1 then 1 when 5 then 5 else 100 end);end;
由于没有符合的情况,所以返回else的100。
条件查询模式:
declarea int:=1000;begindbms_output.put_line(case when a<1 then 1 when a<105 then 5 else 1000 end);end;
由于没有符合的条件,所以返回else字句的返回值。
CASE是一种非常好用的表达式,常常和select查询语句中联合使用。
下列语句用于判断工资水平高低,由于是范围判断,所以无需使用else语句
select ename,case when sal <= 1500 then '低工资' when sal between 1500 and 2500 then '中等工资' when sal>2500 then '高工资' end sallevel from emp;
![2b0cf624af6e12823166f031832257b9.png](https://i-blog.csdnimg.cn/blog_migrate/d2be26cd72a1241cd792fe6d0fd6ac4d.jpeg)
综上就是CASE表达式的简要用法,CASE表达式在MySQL、Sql SERVER中都可以使用,已列入SQL标准。CASE在数据分析中尤其重要。