sql中case语句的使用方法
如何在SQL中使用Case
Case有两种格式。简单案例功能和案例搜索功能。 复制代码代码如下:--简单Case函数
CASE sex
WHEN '1' THEN 'Male'
WHEN ' 2' THEN '女'
ELSE '其他' END
--案例搜索功能
CASE WHEN sex = '1' THEN '男' p>
WHEN sex = '2' THEN '女'
ELSE '其他' END
这两个方法可以实现相同的功能。简单Case函数的编写方法比较简单,但与Case搜索函数相比,在功能上存在一些限制,例如判断表达式的编写。
还有一个问题需要注意。 Case 函数仅返回 fi第一个满足条件的值,其余的 Case 部分将被自动忽略。
--比如下面的SQL,永远不会得到“第二种类型”的结果复制代码代码如下:CASE WHEN col_1 IN ('a ', ' b') THEN '第一类别'
WHEN col_1 IN ('a') THEN '第二类别'
ELSE '其他'END
下面我们来看看使用Case函数我们可以做什么。
首先,将已知数据以另一种方式进行分组和分析。
有如下数据:(为了看得更清楚,我没有使用国家代码,而是直接使用国家名称作为主键)
国家(国家)人口(人口)
中国600
美国100
加拿大100
英国200
法国 300
日本 250
德国国家 200
墨西哥 50
印度 250
基于该国家的人口数据,统计亚洲和北美的人口。你应该得到以下内容ing 结果。
亚洲人口
亚洲1100
北美250
其他700
想要解决这个问题,你会怎么做?用洲代码生成View是一种解决方案,但动态改变统计方法比较困难。
如果使用Case函数,SQL代码如下:复制代码代码如下:SELECT SUM(population),
CASE国家
当“中国”时,那么“亚洲”
当“印度”时,那么“亚洲”
当“日本”时,那么“亚洲”
当“美国”时,那么“北美”
当“加拿大”时,那么“北美”
当“墨西哥”时,那么“北美”
< p>ELSE“其他”ENDFROM Table_A
按国家/地区分组
WHEN“中国”THEN“亚洲”
WHEN “印度”然后“亚洲”
当“日本”然后“亚洲”
当“美国”然后“北美”
当“加拿大” THEN '北美'
WHEN '墨西哥' THEN '北美'
ELSE '其他' END;
同样,我们也可以使用 th是判断薪资级别并统计每个级别的人数的方法。 SQL代码如下; 复制代码 代码如下:SELECT
CASE WHEN 工资 <= 500 THEN '1'
WHEN 工资 > 500 AND 工资 <= 600 THEN '2'
当工资 > 600 AND 工资 <= 800 THEN '3'
当工资 > 800 AND 工资 <= 1000 THEN '4'
ELSE NULL END 工资类,
COUNT(*)
FROM Table_A p>
GROUP BY
CASE WHEN 工资 <= 500 THEN '1 '
当工资 > 500 AND 工资 <= 600 THEN '2'
当工资 > 600 AND 工资 <= 800 THEN '3'
当工资> 800 AND salary <= 1000 THEN '4'
ELSE NULL END;
其次,使用SQL语句完成不同条件的分组。
以下数据可供参考
国家(国家)性别(性别)人口(人口)
中国1 340
中国2 260
美国 1 45
美国 2 55
加拿大 1 51
加拿大 2 49
英国 1 40< /p>
英国 2 60
按国家和性别分组,结果如下
国家男女
中国 340 260
美国 45 55
加拿大 51 49
英国 40 60
一般情况下,也可以使用 UNION 一条语句进行查询。但是这样会增加消耗(两个Select部分),并且SQL语句会更长。
下面是使用Case函数的例子,完成该功能复制代码代码如下:SELECT country,
SUM( CASE WHEN性别 = '1' THEN
人口 ELSE 0 END), --男性人口
SUM( CASE WHEN 性别 = '2' THEN
人口 ELSE 0 END) --女性人口
FROM Table_A
GROUP BY Country;
这样我们就用Select完成了二维的输出形式表,充分显示了Case函数的强大功能。
第三,使用Check中的Case函数。
在很多情况下,使用 Check 中的 Case 功能是一个非常好的解决方案s。可能有很多人根本不使用Check,所以我建议您在阅读以下示例后尝试在SQL中使用Check。
举个例子
A公司规定女员工的工资必须高于1万元。如果用Check和Case来表达的话,如下 复制代码 代码如下:CONSTRAINT check_salary CHECK
( CASE WHEN sex = '2'
THEN CASE WHEN 工资 > 1000
THEN 1 ELSE 0 END
ELSE 1 END = 1 )
如果单纯使用 Check,那就是如下复制代码 代码如下:CONSTRAINT check_salary CHECK
( sex = '2' AND salary > 1000 )
女员工条件符合,但男性员工不能进入。
第四,根据条件选择性UPDATE。
例如有如下更新条件
对于工资在以上的员工,工资会减少%
对于工资在之间的员工至 和 ,他们的工资将增加%
一个容易考虑的事情是选择执行两次UPDATE语句,如下所示复制代码代码如下:--条件
更新人员
SET工资=工资*0.9
WHERE工资>=5000;
--条件
< p>UPDATE人员SET工资=工资*1.15
WHERE工资>=2000 AND工资<4600;
但是事情并没有想象的那么简单,假设有一个人的工资块。首先,根据条件,工资减少%,变成工资。接下来运行第二条SQL的时候,因为这个人的工资在范围之内,所以需要增加%。最终这个人的工资结果不但没有减少,反而增加了。如果反过来的话,那些发工资的人的工资就会减少。不管这个规则有多么荒谬,如果我们想要一条SQL语句来实现这个功能,我们就需要使用Case函数名词代码如下: 复制代码 代码如下:UPDATE Personnel
SET工资= CASE WHEN工资>= 5000
THEN工资* 0.9
WHEN 工资 >= 2000 AND 工资 < 4600
THEN 工资 * 1.15
ELSE 工资 END;
这里需要注意一件事就是最后一行的ELSE工资是必须的。如果没有这条线,不满足这两个条件的人的工资将被写为 NUll,这将是一个严重的问题。 Case函数中Else部分默认值为NULL,需要注意的是。
这个方法还可以用在很多地方,比如更改主键的累活。
一般情况下,如果要交换两条数据的主键a、b,需要经过数据的暂存、复制、读回三个过程。如果您使用 Case 函数,一切都会改变。简单多了。
p_key col_1 col_2
a 1 张三
b 2 李四
c 3 Wang Wu
假设有上述数据,需要交换主键a和b。如果使用Case函数实现,代码如下 复制代码 代码如下: UPDATE SomeTable
SET p_key = CASE WHEN p_key = 'a'
THEN 'b'
当 p_key = 'b'
THEN 'a'
ELSE p_key END
WHERE p_key IN ('a', 'b');
两个唯一密钥也可以交换。需要注意的是,如果需要交换主键,很可能是因为表的原始设计不够充分。建议检查一下表的设计是否合适。
5.检查两个表的数据是否一致。
Case 函数与 DECODE 函数不同。在Case函数中,可以使用BETWEEN、LIKE、IS NULL、IN、EXISTS等,例如使用IN、EXISTS,可以进行子查询,实现更多的功能。
下面举个例子来说明。钍有两个表,tbl_A 和 tbl_B。两个表都有 keyCol 列。现在我们比较两个表。如果tbl_A的keyCol列的数据可以在tbl_B的keyCol列的数据中找到,则返回结果'Matched'。如果未找到,将返回结果“Unmatched”。
要实现下面的功能,可以使用下面两条语句复制代码代码如下:--使用IN
SELECT keyCol时,
CASE WHEN keyCol IN ( SELECT keyCol FROM tbl_B )
THEN“匹配”
ELSE“不匹配”END 标签
FROM tbl_A ; p>
--使用 EXISTS 时
SELECT keyCol,
CASE WHEN EXISTS ( SELECT * FROM tbl_B
WHERE tbl_A.keyCol = tbl_B.keyCol )
THEN '匹配'
ELSE '不匹配'END 标签
FROM tbl_A;
使用 IN 的结果和 EXISTS 是相同的。也可以使用NOT IN和NOT EXISTS,但此时要注意NULL。
六、Case函数中使用total函数
Suppos有下表
学生 ID (std_id) 课程 ID(class_id) 课程名称 (class_name) 专业标志 (main_class_flg)
100 1 经济学 Y
100 2 历史 N
200 2 历史 N
200 3 考古 Y
200 4 计算机 N
300 4 计算机 N< /p>
400 5 化学 N
500 6 数学 N
有些学生选择同时选修几门课程(100, 200),而有些学生只选择一门课程(300、400、500)。选择多门课程的学生必须选择一门课程作为专业,并在专业标志中写上“Y”。对于只选择一门课程的学生,专业标志是N(其实如果写成Y,下面就不会有麻烦了,为了举例,请多加一些)。
现在我们需要根据以下两个条件查询这张表
对于只选了一门课程的人,返回该课程的ID
如果选修过一门以上课程的人,选修过该课程的人,返回选择的主课程ID
简单的思路就是执行两条不同的SQL语句来查询。
条件复制代码 代码如下:--条件:只选过一门课程的学生
SELECT std_id, MAX(class_id) AS main_class
FROM Studentclass
GROUP BY std_id
HAVING COUNT(*) = 1;
执行结果
STD_ID MAIN_class
-------- ----------
300 4
400 5
500 6
条件复制代码代码如下:--条件:从多门课程中选择学生
SELECT std_id, class_id AS main_class
FROM Studentclass
WHERE main_class_flg = 'Y' ;
执行结果
STD_ID MAIN_class
----- - --- -------
100 1
200 3
如果我们使用 Case 函数,我们可以通过以下方式解决问题一条SQL语句,如下: Show复制代码 代码如下: SELECT std_id,
CASE WHEN COUNT(*) = 1 --仅学生的情况选择一门课程
THEN MAX(class_id)
ELSE MAX(CASE WHEN main_class_flg = 'Y'
THEN class_id
ELSE NULL END
)< /p>
END AS main_class
FROM Studentclass
GROUP BY std_id;
运行结果
STD_ID MAIN_class
- ----- ----------
100 1
200 3
300 4
>400 5
500 6
我们可以通过在Case函数中嵌套Case函数并在total函数中使用Case函数来轻松解决这个问题。使用 Case 函数给我们带来了更大的自由度。
最后提醒使用Case函数的新手不要犯以下错误复制代码代码如下:CASE col_1
WHEN 1 THEN 'Right' p>
WHEN NULL THEN 'Wrong'
END
在这个语句中,When Null 行总是返回未知,因此出现错误的情况永远不会发生。因为这句话可以用WHEN col_1 = NULL来代替,这是一个错误的用法。这时候我们应该选择使用WHEN col_1 IS NULL。
以上就是如何在SQL中使用case语句,小编相信其中的一些知识点在我们日常工作中可能会看到或者用到,希望大家能够通过这篇文章了解更多,更多详情请关注行业资讯频道。
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > sql中case语句的使用方法