上表存储了每位同学的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;