MySQL函数(一)—流程控制函数

一、CASE函数

需要对查询结果进行多种情况分析的时候可以使用case函数。

1.1举个例子

 SELECT eno,
    CASE eno WHEN '111' THEN '1' WHEN '112' THEN '2' ELSE 'nomatch'  END result1,
    CASE WHEN eno like '%2%' THEN '1' WHEN eno like '%3%' THEN '2' ELSE 'nomatch' END result2,
    CASE WHEN eno like '%12%' THEN eno  END result3
 FROM emp_info;

结果如下

enoresult1result2result3
1111nomatchNULL
11221112
113nomatch2NULL
114nomatchnomatchNULL
120nomatch1120
121nomatch1121
122nomatch1122
123nomatch1123

1.2使用格式

case函数的使用格式:

	#原
	CASE value WHEN compare_value THEN result [WHEN compare_value THEN result ...] [ELSE result] END
	CASE WHEN condition THEN result [WHEN condition THEN result ...] [ELSE result] END
	#拆解
	CASEWHEN 被比较值 THEN 结果 WHEN 被比较值  THEN 结果 ELSE 结果 END ,
	CASE WHEN 条件 THEN 结果 WHEN 条件 THEN 结果 ELSE 结果 END ,
	CASE WHEN 条件 THEN 结果  END 

译:第一个CASE语法返回第一个value=compare_value比较的结果,该比较为真。第二个语法返回第一个条件为真的结果。如果没有比较或条件为真,则返回ELSE之后的结果,如果没有ELSE部分则返回NULL。

1.3语句分析

1.3.1需求一

查询eno列,当eno的值为111时显示‘1’,当eno的值为112时显示‘2’,否则显示‘nomatch’

	CASE eno WHEN '111' THEN '1' WHEN '112' THEN '2' ELSE 'nomatch'  END result1

结果分析:

enoresult1说明
1111匹配第一个值’111’
1122匹配第二个值’112’
113nomatch没有匹配

1.3.2需求二

当eno的值匹配到2时显示‘1’,当eno的值匹配到3时显示‘2’,否则显示‘nomatch’

	CASE WHEN eno like '%2%' THEN '1' WHEN eno like '%3%' THEN '2' ELSE 'nomatch' END result2

结果分析:

enoresult2说明
1121第一个条件“eno like ‘%2%’”为真
1132第二个条件“”eno like ‘%3%为真’
1231两个条件都为真,但是返回首次匹配为真的结果

特别的,当eno的值为‘123’时,同时满足“like ‘%2%’”和“like ‘%3%’”的条件,但是查询结果为“1”,由此可知匹配具有顺序性,当第一个条件满足时不再执行后续条件。

1.3.3需求三

当eno的值匹配到‘12’时显示eno的值

	CASE WHEN eno like '%12%' THEN eno  END result3

结果分析:

enoresult3说明
111NULL不匹配,且没有ELSE处理,返回空值
112112匹配,返回列值
120120匹配,返回列值

使用case语句时可以不写else,可以只设置一个条件,如果不写else就会返回null值,满足条件后的值可以返回固定的某个值,也可以返回列值。

1.3.4特别说明

使用第一种CASE函数时,可以使用哪些值

SELECT edept,
    #当edept 为‘0’时显示‘1’,为‘生产部’时显示‘2’,否则显示‘nomatch’
    CASE edept WHEN '0' THEN 'FALSE' WHEN '1' THEN 'TRUE' ELSE 'nomatch'  END result4,
    #当edept 为0时显示‘FALSE’,为1时显示‘TRUE’,否则显示‘nomatch’
    CASE edept WHEN 0 THEN 'FALSE' WHEN 1 THEN 'TRUE' ELSE 'nomatch'  END result4,
    #判断edept是否为空,当结果为false时显示部门,为true时显示‘暂无’,否则显示‘nomatch’
    case edept is null WHEN false THEN edept WHEN true THEN '暂无' ELSE 'nomatch'  END result4,
    #判断edept是否为空,当结果为true时显示‘有’,为false时显示‘暂无’,否则显示‘nomatch’
    case edept is not null WHEN true THEN '有' WHEN false THEN '暂无' ELSE 'nomatch'  END result4
 FROM emp_info;
edeptresult4result4result4result4
生产部nomatchFALSE生产部
生产部nomatchFALSE生产部
销售部nomatchFALSE销售部
销售部nomatchFALSE销售部

在一般程序语言里数值0对应FALS、1对应TRUE。首先看最后两列“result4”,

	#当edept 为‘0’时显示‘1’,为‘生产部’时显示‘2’,否则显示‘nomatch’
	case edept is null WHEN false THEN edept WHEN true THEN '暂无' ELSE 'nomatch'  END result4,
	#判断edept是否为空,当结果为true时显示‘有’,为false时显示‘暂无’,否则显示‘nomatch’
	case edept is not null WHEN true THEN '有' WHEN false THEN '暂无' ELSE 'nomatch'  END result4

“edept is null”不成立,值为FALSE,“edept is not null”成立,值为TRUE,所以都匹配第一个条件。
然后看前三列,以及对应的SQL语句:

	#当edept 为‘0’时显示‘1’,为‘生产部’时显示‘2’,否则显示‘nomatch’
	CASE edept WHEN '0' THEN 'FALSE' WHEN '1' THEN 'TRUE' ELSE 'nomatch'  END result4,
	#当edept 为0时显示‘FALSE’,为1时显示‘TRUE’,否则显示‘nomatch’
	CASE edept WHEN 0 THEN 'FALSE' WHEN 1 THEN 'TRUE' ELSE 'nomatch'  END result4,

上两条语句的区别在于第一个“WHEN”的被比较值,一个是数值0,一个是字符‘0’,需要做出区分。那么为什么“edept”中没有0值,也没有false值,第二条语句“CASE edept WHEN 0 THEN ‘FALSE’”却匹配到0值并输出了false呢?

SELECT edept,edept=0,edept=1,
    CASE edept WHEN 0 THEN 'FALSE' WHEN 1 THEN 'TRUE' ELSE 'nomatch'  END result1
 FROM emp_info;
edeptedept=0edept=1result1
生产部10FALSE
生产部10FALSE
生产部10FALSE
销售部10FALSE
销售部10FALSE

“edept”中没有0值,但是“edept=0”输出的是1,也就是true,MySQL判定二者相等,但是为什么相等呢?
MySQL在进行判断时,会判断比较值和被比较值的类型,如果是传入的是字符串,被比较值是整形,且字符串不是数值,则字符串会被转换为0,故“edept=0”在“edept”不是数值的情况下统一转换为0。

Tips

比较值时需要规范数据类型,否则会遇到隐式类型转换,出现结果集与预期不符的情况。

二、IF()函数

需要对查询结果进行处理时可以使用if函数,在使用上,偏向三目运算符。

2.1举个例子

SELECT eno,
	IF(STRCMP(eno, '111'), 'yes', 'Yes') as result1,
    IF(STRCMP(eno, '112'), 2, '3') as result2,
    IF(STRCMP(eno, '112'), 2, 3) as result3
FROM
    emp_info;

结果如下:

enoresult1result2result3
111Yes22
112yes33
120yes22
121yes22

2.2使用格式

	#原
	IF(expr1,expr2,expr3)

译:如果expr1为TRUE (expr1 <> 0且expr1 is NOT NULL), If()返回expr2。否则,返回expr3。

2.3语句分析

2.3.1需求一

比较eno和‘111’,为真时返回’yes’,否则返回‘Yes’

	IF(STRCMP(eno, '111'), 'yes', 'Yes') AS result1

结果如下

enoresult1
111Yes
112yes

返回结果区分大小写

2.3.2需求二

比较eno和‘112’,为真时返回2,否则返回3

    IF(STRCMP(eno, '112'), 2, '3') as result2,
    IF(STRCMP(eno, '112'), 2, 3) as result3
enoresult2result3
11122
11233
12022
12122

返回结果看起来相同,但是返回的数据类型并不相同:
在这里插入图片描述
可以看出,result2的返回类型时varchar也就是字符型,而result3返回的是bigint也就是长整型。当expr2或者expr3有一个是字符型,那么结果就是字符型。例如:

SELECT 
	IF(STRCMP(eno, '112'), sqrt(5), '3') AS result1,
    IF(STRCMP(eno, '112'), current_date(), '3') AS result2,
    IF(STRCMP(eno, '112'), true, '3') AS result3
FROM
    emp_info;

返回结果:

result1result2result3
2.236067977499792023-02-211
333
2.236067977499792023-02-211
2.236067977499792023-02-211

返回类型:
在这里插入图片描述

2.3.3特别说明

如果expr1为null值或者为0值会出现什么情况?

SELECT 
    IF(null, 1, 2) AS result1,
    IF(0, 1, 2) AS result2;
result1result2
22

会一直返回expr3。

Tips

注意expr2和expr3的类型

三、IFNULL()函数

当需要对查询结果进行null值处理时可以使用IFNULL函数

3.1举个例子

SELECT 
    IFNULL(ename, 'lose') AS result1,
    IFNULL(ename, CURDATE()) AS result2,
    IFNULL(ename, 1 / 2) AS result3
FROM
    emp_info;

结果如下:

result1result2result3
程小鸭程小鸭程小鸭
lose2023-02-210.5000
陈二狗陈二狗陈二狗
lose2023-02-210.5000

3.2使用格式

	#原
	IFNULL(expr1,expr2)

译:如果expr1不是NULL, IFNULL()返回expr1;否则返回expr2。

3.3语句分析

3.1需求一

如果ename是null值,返回lose,否则返回姓名

	IFNULL(ename, 'lose') AS result1,

这里需要注意null值和空值‘ ’的区别,null值如下
在这里插入图片描述
空值如下:
在这里插入图片描述

3.2特别说明

数据的返回类型遵循什么规则?
样例的返回类型如下:
在这里插入图片描述

Tips

IFNULL(expr1,expr2)的默认返回类型是两个表达式中更“通用”的,顺序为STRING、REAL或INTEGER。

四、NULLIF()函数

4.1举个例子

SELECT 
    NULLIF(eno, '111') AS result1,
    NULLIF(salary, 6000) AS result2
FROM
    emp_info;

结果如下:

result1result2
NULL5000
1125600
1135900
114NULL

4.2使用格式

#原
NULLIF(expr1,expr2)

译:如果expr1 = expr2为真则返回NULL,否则返回expr1。这与CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END相同。返回值的类型与第一个参数相同。

4.3语句分析

4.3.1需求一

当eno为‘111’时,返回null值

	NULLIF(eno, '111') AS result1,

4.3.2特别说明

此函数返回null值,而ifnull函数是判断是否为null并选值返回,注意区分。

5、小结

对于函数的使用,需要注意MySQL默认的类型转换,如果用在程序中,需要注意返回类型。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL流程控制函数是指可以控制存储过程或函数中执行流程的语句。其中几个常用的流程控制函数包括IF函数。IF函数可以用于条件判断,根据条件返回不同的结果。例如,可以使用IF函数来对查询结果进行处理。在MySQL中,IF函数的语法通常是IF(condition, value1, value2),当condition满足时返回value1,否则返回value2。在使用IF函数时,可以将其类比于三目运算符,即根据条件进行选择返回不同的值。举一个例子,可以使用IF函数来判断eno的值,如果eno与'111'不相等,则返回'yes',否则返回'Yes';如果eno与'112'不相等,则返回2,否则返回3。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MySQL——流程控制函数](https://blog.csdn.net/qq_41596778/article/details/130282443)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [MySQL函数(一)—流程控制函数](https://blog.csdn.net/qy8189/article/details/129045163)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值