sql中case语句的使用方法

分类:编程技术 时间:2024-02-20 15:29 浏览:0 评论:0
0
本文与大家分享如何在SQL中使用case语句。小编觉得还是比较实用的,所以分享给大家学习一下。希望您读完本文后有所收获。话不多说,跟着小编一起来看看吧。让我们来看看。

如何在SQL中使用Case

Case有两种格式。简单案例功能和案例搜索功能。 复制代码代码如下:--简单Case函数

CASE sex

WHEN '1' THEN 'Male'

WHEN ' 2' THEN '女'

ELSE '其他' END

--案例搜索功能

CASE WHEN sex = '1' THEN '男'

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“其他”END

FROM 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

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 ;

--使用 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'

WHEN NULL THEN 'Wrong'

END

在这个语句中,When Null 行总是返回未知,因此出现错误的情况永远不会发生。因为这句话可以用WHEN col_1 = NULL来代替,这是一个错误的用法。这时候我们应该选择使用WHEN col_1 IS NULL。

以上就是如何在SQL中使用case语句,小编相信其中的一些知识点在我们日常工作中可能会看到或者用到,希望大家能够通过这篇文章了解更多,更多详情请关注行业资讯频道。

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > sql中case语句的使用方法

用户评论