之前一直写的SQL似乎是有点太初级了,在完成一些稍微复杂点的查询的时候基本所有情况下都是直接获取了所有的数据然后在后台再处理一遍。
今天写东西有点时间就研究了一会的SQL发现一些很简单的语句有一些比较有意思的用法,大概谢谢分享一下心得也为以后给自己写东西做个记录,,以下是正文:
---------------------------------------------------分割线----------------------------------------
首先来说一下case语句,
在SQL里面一般进行查询时不能写if...else的,但是在很多的查询中我们会需要对将要查询的表或者视图中的值进行一下判断然后再取值,在以前我处理这种数据时基本都是先取到数据库的值,然后前台或者后台来处理一下数据,然后反应到用户眼中,例子:
比如说有一张表SYSUSER,在表里面有个字段名字叫SEX,然后存储的内容是0和1,1代表男,0代表女,现在要在数据库中取出这个字段数据,基本的写法是:
SELECT SEX FROM SYSUSER
在取到数据之后再写入判断,比如:
if(item.sex == '0')
return '女';
return '男'
这样稍微有点麻烦,我们可以直接使用case语句在查询数据库的时候就直接格式化数据:
SELECT (CASE SEX WHEN 1 THEN '男' ELSE '女' END) AS SEX FROM SYSUSER
这样在前台就能直接展示数据了。
case的语法比较简单,和常规的if...else基本没什么区别
case 字段名 when 比较值 then 结果1 else 结果2 end
意思大概是,在本次查询的行数据中,字段名所对应的值是否等于比较值,如果相等则返回结果1,否则返回结果2。也能写作:
case when 表达式 then 结果1 else 结果2
大概意思是,如果本次查询的行数据中,表达式成立,则返回结果1,否则返回结果2。
这两种写法所实现的功能基本是相同的,只是第一种写法相对来说更简洁一些,第二种方法相对来说更灵活一些。
大概复习了一下case语句以后我们来看看它除了上述的功能还能做到点什么:
还是说这个SYSUSER表,有个字段叫做AGE,记录了用户的年龄数据,我现在的需求是,知道20岁一下、20到30岁、31到40岁以及40岁以上的用户共有多少,代码:
select Count(*) as UserCount , case when AGE < 20 then '20>' when AGE>=20 And AGE < 30 then '20~30' when AGE>=31 And Age < 40 then '31~40' when Age >=41 then '41<' else '未填写年龄' end from sysuser group by case when AGE < 20 then '20>' when AGE>=20 And AGE < 30 then '20~30' when AGE>=31 And Age < 40 then '31~40' when Age >=41 then '41<' else '未填写年龄' end
返回的结果大概就是:
UserCount exp1
n 20>
m 20~30
i 31~40
j 40<
然后再深入点,任然是这张表,任然是AGE和SEX两个字段,我要统计四个年龄段中各有男女多少人,代码:
select Sum(case sex when 1 then 1 else 0 end) as '男',Sum(case sex when 0 then 1 else 0 end) as '女',case when AGE < 20 then '20>' when AGE>=20 And AGE < 30 then '20~30' when AGE>=31 And Age < 40 then '31~40' when Age >=41 then '41<' else '未填写年龄' end from sysuser group bu case when AGE < 20 then '20>' when AGE>=20 And AGE < 30 then '20~30' when AGE>=31 And Age < 40 then '31~40' when Age >=41 then '41<' else '未填写年龄' end
大概的样子就是:
男 女 exp1
a b 20>
c d 20~30
e f 31~40
j h 40<
最后再说一个,任然是这张表,我要达到的效果是:
性别 20以下 20~40 40以上
男 a b c
女 d e f
select (case sex when 1 then '男' else '女' end)as '性别',Sum(case when Age < 20 then 1 else 0 end) as '20以下',Sum(case when Age >= 20 And Age < 40 then 1 else 0 end) as '20~40' , Sum(case when Age >= 40 then 1 else 0) as '40以上' from sysuser group by (case sex when 1 then '男' else '女' end)as '性别'
以上就是最近写case的一点小心得,有些错的还请大家帮我指出来矫正一下,感谢~