当前位置: 首页 > news >正文

SQL-流程控制函数

一、IF函数:条件判断函数

IF函数用于根据条件的真假返回不同的值,类似程序中的 “三目运算符”。

语法格式:

IF(condition, value_if_true, value_if_false)

  • condition:判断条件(返回TRUEFALSE的表达式);
  • value_if_true:条件为TRUE时返回的值;
  • value_if_false:条件为FALSE时返回的值。
示例解析:
-- 条件为TRUE(真),返回第二个参数'ok'
select if(true, 'ok', 'Error'); -- 结果:'ok'-- 条件为FALSE(假),返回第三个参数'Error'
select if(false, 'ok', 'Error'); -- 结果:'Error'

实际应用场景:根据字段值动态返回描述,例如:

-- 若年龄>=18,返回'成年',否则返回'未成年'
select name, if(age >= 18, '成年', '未成年') as age_desc from emp;
注意事项:
  1. condition可以是任意返回布尔值的表达式(如age > 30gender = '男'等);
  2. conditionNULL,函数返回value_if_false(视为FALSE);
  3. 函数返回值的类型由value_if_truevalue_if_false决定,若类型不同可能发生隐式转换(如数值和字符串混合时,可能转为字符串)。

二、IFNULL函数:空值处理函数

IFNULL函数用于判断第一个参数是否为NULL,若不为NULL则返回该值,否则返回第二个参数(默认值)。

语法格式:

IFNULL(expr1, expr2)

  • expr1:待判断的表达式;
  • expr2:当expr1NULL时返回的值。
示例解析:
-- 第一个参数'ok'不为NULL,返回'ok'
select ifnull('ok', 'default'); -- 结果:'ok'-- 第一个参数是空字符串(''),不为NULL,返回空字符串(''≠NULL)
select ifnull('', 'default'); -- 结果:''-- 第一个参数是NULL,返回第二个参数'default'
select ifnull(null, 'default'); -- 结果:'default'

实际应用场景:处理可能为NULL的字段,避免结果中出现NULL,例如:

-- 若idcard为NULL,返回'未填写',否则返回实际身份证号
select name, ifnull(idcard, '未填写') as idcard_desc from emp;
注意事项:
  1. 仅判断NULLIFNULL只对NULL生效,对空字符串('')、0等非NULL值不处理(如上述示例中的ifnull('', 'default')返回'');
  2. 兼容性:IFNULL是 MySQL 特有函数,其他数据库有类似函数但名称不同(如 SQL Server 用ISNULL,Oracle 用NVL);
  3. 若两个参数都为NULL,返回NULL(如ifnull(null, null) → NULL)。

三、CASE函数:多条件分支判断

CASE函数用于实现多条件分支判断,类似程序中的 “if-else if-else” 或 “switch-case”,分为 ** 简单CASE搜索CASE** 两种形式。

1. 简单CASE表达式(等值判断)

语法格式

CASE 表达式WHEN 值1 THEN 结果1WHEN 值2 THEN 结果2...ELSE 默认结果
END
  • 先计算 “表达式” 的值,再依次与WHEN后的 “值” 比较,匹配则返回对应 “结果”;
  • 若均不匹配,返回ELSE后的 “默认结果”(若省略ELSE,返回NULL)。

示例解析

-- 对emp表的workaddress进行分类:北京、上海→一线城市,其他→二线城市
select emp.name,-- 简单CASE:判断workaddress的值,匹配则返回对应结果(case emp.workaddress when '北京' then '一线城市'  -- 若workaddress='北京',返回'一线城市'when '上海' then '一线城市'  -- 若workaddress='上海',返回'一线城市'else '二线城市'  -- 其他情况返回'二线城市'end) as '工作地址'  -- 结果列别名为'工作地址'
from emp;

假设emp表中某员工的workaddress为 ' 南京 ',则该员工的 “工作地址” 列返回 ' 二线城市 '。

2. 搜索CASE表达式(条件判断)

语法格式

CASEWHEN 条件1 THEN 结果1WHEN 条件2 THEN 结果2...ELSE 默认结果
END
  • 依次判断WHEN后的 “条件”,第一个满足条件的分支返回对应 “结果”;
  • 若均不满足,返回ELSE后的 “默认结果”(若省略ELSE,返回NULL)。

示例解析
首先创建score表并插入数据:

-- 创建学员成绩表,包含ID、姓名及数学、英语、语文成绩
create table score(id int comment 'ID',name varchar(10) comment '姓名',math int comment '数学',english int comment '英语',chinese int comment '语文'
)comment '学员成绩表';-- 插入3条学员成绩数据
insert into score (id, name, math, english, chinese) values (1, 'Tom', 67, 88, 95),  -- Tom:数学67,英语88,语文95(2, 'Rose', 23, 66, 90), -- Rose:数学23,英语66,语文90(3, 'Jack', 56, 98, 76); -- Jack:数学56,英语98,语文76

查询并对各科成绩分级(优秀:≥85;及格:≥60 且 < 85;不及格:<60):

-- 查看score表所有数据(用于对比分级结果)
select * from score;-- 对数学、英语、语文成绩分别分级
selectid,name,-- 数学成绩分级:搜索CASE,按条件顺序判断case when math >= 85 then '优秀'  -- 条件1:数学≥85→优秀when math >=60 then '及格'   -- 条件2:数学≥60(且<85)→及格(因条件1不满足)else '不及格' end as math_level,  -- 其他→不及格,列别名为math_level-- 英语成绩分级(逻辑同上)case when english >= 85 then '优秀' when english >=60 then '及格' else '不及格' end as english_level,-- 语文成绩分级(逻辑同上)case when chinese >= 85 then '优秀' when chinese >=60 then '及格' else '不及格' end as chinese_level
from score;

查询结果解析

  • Tom 的数学 67 分:满足math >=60但不满足>=85及格
  • Tom 的英语 88 分:满足english >=85优秀
  • Rose 的数学 23 分:不满足前两个条件→不及格
CASE函数注意事项:
  1. 分支顺序敏感CASE函数按WHEN的顺序判断,找到第一个满足条件的分支后立即返回,后续分支不再执行。例如:

    -- 错误示例:条件顺序颠倒,会导致所有≥60的分数都返回'及格'(包括≥85的)
    case when math >=60 then '及格' when math >=85 then '优秀'  -- 永远不会执行else '不及格' end
    

    需按 “范围从大到小” 或 “优先级从高到低” 排列条件。

  2. ELSE的必要性:若省略ELSE且所有条件都不满足,返回NULL。建议显式添加ELSE明确默认值,避免意外NULL

  3. 返回值类型统一THEN后的值类型应尽量一致(如均为字符串或均为数值),否则可能发生隐式转换,影响结果可读性。

  4. 适用场景广泛:可用于字段值转换(如将编码转为名称)、分级统计(如成绩等级)、条件聚合(如按不同条件计算总和)等。

总结

  • IF(condition, v1, v2):简单二分支判断,适合非此即彼的场景;
  • IFNULL(expr, default):处理NULL值,返回默认值(仅对NULL生效);
  • CASE:多分支判断,支持等值匹配(简单CASE)和条件判断(搜索CASE),适合复杂逻辑。

文章转载自:

http://UQGT8V11.gqbks.cn
http://n81T9QWS.gqbks.cn
http://Pv0xNJQy.gqbks.cn
http://gJANRHLE.gqbks.cn
http://t3iXyYud.gqbks.cn
http://2MW0G8fH.gqbks.cn
http://FYYSBXwH.gqbks.cn
http://qCbUl9hv.gqbks.cn
http://wn7yyzzf.gqbks.cn
http://5MsNe6PG.gqbks.cn
http://Utb8KC11.gqbks.cn
http://6VGTm8Qz.gqbks.cn
http://mYOszgR3.gqbks.cn
http://UznOnSaV.gqbks.cn
http://AMtItjPa.gqbks.cn
http://SF0FlrDT.gqbks.cn
http://3Bh0JaIv.gqbks.cn
http://zGA8z1WT.gqbks.cn
http://XS16K5U1.gqbks.cn
http://ffYy710C.gqbks.cn
http://sDCByak3.gqbks.cn
http://a1VynpJg.gqbks.cn
http://n8qel7eE.gqbks.cn
http://cMTY6n3C.gqbks.cn
http://hUGXRR3d.gqbks.cn
http://IjdCRNu9.gqbks.cn
http://y1QfATZL.gqbks.cn
http://yN0kLn3U.gqbks.cn
http://VmUvEKVz.gqbks.cn
http://OCRKpUFL.gqbks.cn
http://www.dtcms.com/a/384913.html

相关文章:

  • TNNLS-2015《Linear-Time Subspace Clustering via Bipartite Graph Modeling》
  • 线性代数 · 行列式 | 子式 / 主子式 / 顺序主子式 / 余子式 / 代数余子式
  • LLM的MTP论文阅读
  • 软考-系统架构设计师 软件工程详细讲解
  • MATLAB 实现基于 GMM-HMM的语音识别系统
  • Day24_【深度学习(4)—PyTorch使用—张量的数值计算】
  • 2019年下半年 系统架构设计师 综合知识
  • C++类和对象详解(2);初识类的默认成员函数
  • AI智能体的应用前景
  • 文档驱动的AI协作 (DDAC) 工作流
  • Selenium 与 Playwright 安装及浏览器驱动配置
  • 数字丝绸之路的暗礁,解码“一带一路”与RCEP时代的跨境法治挑战
  • fabric启动节点var/hyperledger/production: permission denied
  • 小型无人机传感器仿真模型MATLAB实现方案
  • 拓扑dp|博弈|正难则反
  • linux时间管理
  • 第2章 语言模型:自然语言处理的基石
  • 汽车电子电气架构 --- 新趋势下的挑战与技术
  • 地铁站电子钟:NTP实时校准时间
  • 【数据集】2025年国家自然科学基金立项名单(经管类)
  • Elastic APM 2025 新特性:Tail-based Sampling 和 GenAI 优化
  • 如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘sklearn’ 问题
  • 《二战系统分析师》第五章总结
  • 机器学习中的距离总结
  • MongoDB集群开发完全指南:从原理到实践
  • apache phoenix sql 命令大全详解
  • python 读取大文件优化示例
  • 布草洗涤厂设备租赁押金原路退回系统—东方仙盟
  • JAVASCRIPT 前端数据库-V9--仙盟数据库架构-—仙盟创梦IDE
  • 开源AI大模型、AI智能名片与S2B2C商城小程序:从“不出现=不存在”到“精准存在”的数字化转型路径