java case when 多条件_case表达式—多条件表达式

主题:case表达式—多条件表达式

一、概念

1、基本语法

case when 条件1 then 值1

when 条件2 then 值2

when 条件3 then 值3

....

else 值n end

2、执行过程:

整个表达式有一个计算结果:和if else if else 一样

3、语法要求

1)条件是有顺序的

2)所有的条件后面的值,要是同一类型

3)建议不要少了else,如果省了,则所有when都不成立,则返回null

4)end不能少

5)每一个条件后不要打,

二、替换应用

select st_id,(

CASE WHEN course_id='001' THEN 'java'

WHEN course_id='002' THEN 'oracle'

WHEN course_id='003' THEN 'python'

ELSE null END

) as kcm,score

from cjb;

执行流程:

1)从from后面的表中取第一行,用这一行作为参数,执行select

2)select从左至右一个一个列得出结果,作为查询结果第一行的值

3)再取from后面表的下一行,执行上面两步,直到表中所有行

三、行列转换

表的竖横转换

注意:表查询处理单位是from后面表的行

select st_id,

(case when course_id='001' then score else 0 end) as java,

(case when course_id='002' then score else 0 end) as oracle,

(case when course_id='003' then score else 0 end) as python

from cjb

group by st_id

执行流程:

1)选择from后面的表中第一行

2)用第一行的各列的值为参数,代入到select后面的各列的表达式中,计算结果,形成结果的第一行

3)用from后面的表中的下一行,执行12两步,直到from后面表中所有行处理完

select st_id,

sum(case when course_id='001' then score else 0 end) as java,

sum(case when course_id='002' then score else 0 end) as oracle,

sum(case when course_id='003' then score else 0 end) as python

from cjb

group by st_id

练习:查询成绩表,显示为如下结果

010103 已选修 已选修 未选修

select st_id,(case when st_id in(select st_id from cjb where course_id='001') then '已选修' else '未选修' end)as java,

(case when st_id in(select st_id from cjb where course_id='002') then '已选修' else '未选修' end)as oracle,

(case when st_id in(select st_id from cjb where course_id='003') then '已选修' else '未选修' end)as 离散数学

from xsb;

四、多条件约束

为cjb添加成绩约束:001课程【0,100】,002课程【0,120】,003课程【0,150】

方法一:

alter table cjb

add(constraint ck_score check((case when course_id='001' and score>=0 and score<=100 then 1

when course_id='002' and score>=0 and score<=120 then 1

when course_id='003' and score>=0 and score<=150 then 1

else 0 end)=1 ))

方法二:

alter table cjb

add(constraint ck_score check(case when course_id='001' then case when score>=0 and score<=100 then 1 else 0 end

when course_id='002' then case when score>=0 and score<=120 then 1 else 0 end

when course_id='003' then case when score>=0 and score<=150 then 1 else 0 end

else 1 end =1))

说明:

check约束的本质是当往数据表中插入数据或更新数据时,执行check的约束语句,得出结果真假,真就插入或插入成功,假就拒绝插入或更新

case返回的一个普通值,不是真假

case不是返回一个表达式,而是返回一个表达式的计算结果,这个结果是一个普通的值

最后的else的值为0和1的含义是不同的

方法1和方法2是有区别的,方法1的else不能返回1

为了是的check中的返回值是真假,用case的结果和一个值比较

五、主键值交换

交换两个主键的值,交换xsb中两个学生的学号

select * from xsb

--方法一:

update xsb set st_id='a' where st_id='010110'

update xsb set st_id='010110' where st_id='010111'

update xsb set st_id='010111' where st_id='a'

---上面方法繁琐,还效率低

--方法二:

update xsb

set st_id=case when st_id='010110' then '010111'

when st_id='010111' then '010110'

else st_id end

where st_id in ('010110','010111')

说明:

方法一:如果不用轮换,是会违反主键约束

方法二:由于在一次update执行过程中,主键可以相同,但是在执行完毕必须不同

六、多条件更新

修改cjb中的记录的成绩值,【70-80】之间变成1.1倍,如果是【80-90】之间变成原来的0.9

根据上面方法,完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值