Excel & SQL | 控制函数 | 04

上表存储了每位同学的id、name (姓名)、class (班级)和score(成绩)四个字段。我们把上表中的数据存储在demo数据库的chapter8表中。

if()函数

对于Excel中的if()函数,读者应该都比较熟悉了,SQL中的if()函数与Excel中的原理基本一样,也是用来对某一个条件进行判断的,这里的判断主要就是我们前面讲过的比较运算。如果条件满足,则返回一个值;如果条件不满足,则返回另一个值。具体实现形式如下:

if(condition,a,b)

如果condition为真,则返回a值,否则返回b值。判断流程如下图所示。

现在我们要对某个分数进行判断,如果分数大于或等于60分,则返回“及格”,否则返回“不及格”,可以通过如下代码实现:

select if(50>=60,"及格";"不及格")

运行上面的代码,最后返回的结果为不及格。
如果我们要对表中某一列的每个值进行判断,只需要把上面代码中的50换成对应的列名即可,这样就是将该列中的每个值与60进行比较。比如,我们要对chapter8表中的每位同学的成绩进行判断,可以通过如下代码实现︰

select id,score,if(score>=60,"及格","不及格") as score_result from chapter8;

上面的例子利用的是简单的if()函数,if()函数还可以进行嵌套,也就是if()函数中还是if()函数。比如,我们要对某个分数进行判断,如果小于60分,则返回不及格,如果不小于60分但是小于80分,则返回良好,否则返回优秀,可以通过如下代码实现︰

select id,score,if(score<60,"不及格",if(score<80,"良好","优秀")) as score_result from chapter8;

case when函数

上面我们讲了多层if嵌套,就是先判断condition是否满足某个条件,如果满足,则返回一个值或进行下一个if判断;如果不满足,则返回一个值或进行下一个if判断。

虽然多层嵌套的原理比较简单,但是如果层数太多,读者还是会容易写混的,基于此,就有了这一节要讲的case when函数。case when函数主要有如下两种书写形式。

形式1:

case列名
	when 条件1 then返回值1
	when 条件2 then返回值2
	...
	when 条件n then返回值n
	else 返回默认值
end

注意:没有逗号!不要忘记end!

形式1是对某一列进行多层判断,如果这一列中的值满足条件1,则返回值1﹔如果这一列中的值满足条件2,则返回值2﹔如果这一列中的值满足条件n,则返回值n ;如果前面的n个条件都不满足,则返回指定的默认值﹔最后以end结束,且end一定要有。需要注意的是,形式1的条件只能是具体的值,而不能进行比较运算,如果进行比较运算会报错。

现在我们有这样一个需求,对chapter8表中class列的值进行替换,如果是一班,则返回class1;如果是二班,则返回class2;如果是三班,则返回class3,否则返回其他。这个需求可以通过如下代码实现:

select id,class,(case class
                when "一班" then "class1"
                when "二班" then "class2"
                when "三班" then "class3"
                else "其他"
                end) as class_result from chapter8;

形式2:

case
	when 列名满足条件1 then返回值1
	when 列名满足条件2 then返回值2
	...
	when 列名满足条件n then返回值n
	else 返回默认值
end

形式1不支持对列名进行比较运算,但是形式2是支持的,比如,前面讲过的多层if嵌套就可以通过形式2来实现,具体实现代码如下:

select id,score,(case
                when score<60 then "不及格"
                when score<80 then "良好"
                when score<100 then "优秀"
                else "可有可无 只是语法测试"
                end) as score_result from chapter8;
                

小结

sql的if语句
	select if(50>=60,"yes","no");
	select id,score,if(score>=60,"及格","不及格") as score_result from chapter8;
	select id,score,if(score<60,"不及格",if(score<80,"良好","优秀")) as score_result from chapter8;
	
case when
	基于对列的常量判断
	select id,class,(case class
                when "一班" then "class1"
                when "二班" then "class2"
                when "三班" then "class3"
                else "其他"
                end) as class_result from chapter8;
    基于对整列进行判断
	select id,score,(case
                when score<60 then "不及格"
                when score<80 then "良好"
                when score<100 then "优秀"
                else "可有可无 只是语法测试"
                end) as score_result from chapter8;
	
	
	
posted @ 2021-08-03 13:02  RowryCho  阅读(855)  评论(0编辑  收藏  举报