【重学 MySQL】八十二、深入探索 CASE 语句的应用

news2024/11/14 8:43:22

【重学 MySQL】八十二、深入探索 CASE 语句的应用

  • CASE语句的两种形式
  • CASE语句的应用场景
    • 数据分类
    • 动态排序
    • 条件计算
    • 在 `SELECT` 子句中使用
    • 在 `WHERE`子句中使用
    • 在 `ORDER BY` 子句中使用
  • 注意事项

在这里插入图片描述
在MySQL中,CASE 语句提供了一种强大的方式来实现条件分支逻辑,它相当于编程中的 if-elseswitch 语句,允许在SQL查询中根据条件表达式的值选择不同的执行路径。

CASE语句的两种形式

  1. 简单CASE语句
CASE value_expression
    WHEN value1 THEN result1
    WHEN value2 THEN result2
    ...
    ELSE resultN
END

其中,value_expression是要比较的表达式,WHEN valueN THEN resultN是基于value_expression的比较结果来选择的分支,ELSE resultN是所有WHEN条件都不满足时的默认结果。

  1. 搜索CASE语句
CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    ELSE resultN
END

其中,WHEN conditionN THEN resultN直接基于条件表达式conditionN的真值来选择执行的分支,ELSE resultN是所有条件都不满足时的默认结果。

CASE语句的应用场景

数据分类

CASE 语句可以根据某些条件对数据进行分类,返回不同的标签或值。例如,可以根据销售量对销售情况进行分类:

SELECT ProductName, Sales,
    CASE
        WHEN Sales < 100 THEN 'Low'
        WHEN Sales BETWEEN 100 AND 500 THEN 'Medium'
        ELSE 'High'
    END AS SalesCategory
FROM SalesData;

这个查询会返回每个产品的销售量,并根据销售量将其分类为’Low’、‘Medium’或’High’。

动态排序

CASE 语句还可以根据不同的条件对结果集进行排序。例如,可以根据用户的偏好(价格或评级)来对产品进行排序:

SELECT * FROM Products
ORDER BY CASE
    WHEN UserPreference = 'Price' THEN Price
    WHEN UserPreference = 'Rating' THEN Rating
END;

条件计算

CASE 语句可以进行复杂的计算,计算规则根据行中的数据动态变化。例如,处理一个包含以“万”结尾的字符串值的view_count列,并筛选出查看次数超过10000的记录:

SELECT COUNT(*) AS count, product_type
FROM video_view
WHERE product_type != 0
    AND create_time BETWEEN '2024-01-27 11:02:10' AND '2024-03-27 11:02:10'
    AND (CASE
        WHEN view_count LIKE '%万%' THEN CAST(REPLACE(view_count, '万', '') AS DECIMAL(10, 2)) * 10000
        ELSE CAST(view_count AS DECIMAL(10, 2))
    END) > 10000
GROUP BY product_type
ORDER BY count DESC;

这个例子演示了如何使用CASE语句结合字符串函数和数学运算,将格式不统一的数据标准化处理,以进行有效的数据筛选。

SELECT 子句中使用

可以根据某个字段的值返回不同的结果。例如,根据job_title返回员工所属的部门:

SELECT employee_id, job_title, 
    CASE job_title 
        WHEN 'Engineer' THEN 'IT Department'
        WHEN 'Manager' THEN 'Management'
        ELSE 'Other Department' 
    END AS department

WHERE子句中使用

CASE 语句还可以用于在 WHERE 子句中根据不同的条件应用不同的过滤条件。例如,根据不同的product_type应用不同的过滤条件:

SELECT * FROM products
WHERE CASE 
    WHEN product_type = 'Electronics' THEN category_id = 1
    WHEN product_type = 'Clothing' THEN category_id = 2
    -- 可以添加更多条件
END

注意:虽然 CASE 语句可以在 WHERE 子句中使用,但通常建议尽量避免,因为可能会影响查询性能。更好的做法是使用逻辑运算符(如 ANDOR )来组合条件。

ORDER BY 子句中使用

可以根据某个字段的值动态地改变排序顺序。例如,首先根据job_title是否为’Manager’来排序:

SELECT employee_id, job_title, salary 
FROM employees
ORDER BY CASE 
    WHEN job_title = 'Manager' THEN 1
    -- 可以添加更多条件
END, salary DESC; -- 如果job_title不是'Manager',则按salary降序排序

注意事项

  1. ELSE 子句是可选的,但如果省略了 ELSE 子句且找不到匹配项,MySQL将返回 NULL。如果希望在没有匹配项时返回特定的值或进行特定的处理,应使用 ELSE 子句。
  2. CASE 语句中的条件是按顺序评估的,一旦找到满足条件的分支,就会执行该分支中的命令并结束 CASE 语句的执行。因此,在编写 CASE 语句时,应注意条件的顺序和逻辑关系。
  3. 在使用 CASE 语句时,应确保条件表达式和比较值的类型匹配,以避免类型不匹配导致的错误或不正确的结果。

综上所述,MySQL中的 CASE 语句是一个功能强大且灵活的工具,可以用于实现复杂的条件逻辑和数据处理需求。通过合理地使用 CASE 语句,可以使SQL查询更加简洁、高效和易于维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2239084.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

由播客转向个人定制的音频频道(1)平台搭建

项目的背景 最近开始听喜马拉雅播客的内容&#xff0c;但是发现许多不方便的地方。 休息的时候收听喜马拉雅&#xff0c;但是还需要不断地选择喜马拉雅的内容&#xff0c;比较麻烦&#xff0c;而且黑灯操作反而伤眼睛。 喜马拉雅为代表的播客平台都是VOD 形式的&#xff0…

7+纯生信,单细胞识别细胞marker+100种机器学习组合建模,机器学习组合建模取代单独lasso回归势在必行!

影响因子&#xff1a;7.3 研究概述&#xff1a; 皮肤黑色素瘤&#xff08;SKCM&#xff09;是所有皮肤恶性肿瘤中最具侵袭性的类型。本研究从GEO数据库下载单细胞RNA测序&#xff08;scRNA-seq&#xff09;数据集&#xff0c;根据原始研究中定义的细胞标记重新注释各种免疫细胞…

uniapp解析蓝牙设备响应数据bug

本文章为了解决《uniapp 与蓝牙设备收发指令详细步骤(完整项目版)》中第十步的Array 解析成 number函数bug 1、原代码说明 function array16_to_number(arrayValue) {const newArray arrayValue.filter(item > String(item) ! 00 || String(item) ! 0)const _number16 ne…

【递归回溯与搜索算法篇】算法的镜花水月:在无尽的自我倒影中,递归步步生花

文章目录 递归回溯搜索专题&#xff08;一&#xff09;&#xff1a;递归前言第一章&#xff1a;递归基础及应用1.1 汉诺塔问题&#xff08;easy&#xff09;解法&#xff08;递归&#xff09;C 代码实现时间复杂度和空间复杂度易错点提示 1.2 合并两个有序链表&#xff08;easy…

大数据开发面试宝典

312个问题&#xff0c;问题涵盖广、从自我介绍到大厂实战、19大主题&#xff0c;一网打尽、真正提高面试成功率 一、Linux 1. 说⼀下linux的常⽤命令&#xff1f; 说一些高级命令即可 systemctl 设置系统参数 如&#xff1a;systemctl stop firewalld关闭防火墙 tail / hea…

链表归并与并集相关算法题|两递增归并为递减到原位|b表归并到a表|两递减归并到新链表(C)

两递增归并为递减到原位 假设有两个按元素递增次序排列的线性表&#xff0c;均以单链表形式存储。将这两个单链表归并为一个按元素递减次序排列的单链表&#xff0c;并要求利用原来两个单链表的节点存放归并后的单链表 算法思想 因为两链表已按元素值递增次序排列&#xff0…

【RabbitMQ】06-消费者的可靠性

1. 消费者确认机制 没有ack&#xff0c;mq就会一直保留消息。 spring:rabbitmq:listener:simple:acknowledge-mode: auto # 自动ack2. 失败重试机制 当消费者出现异常后&#xff0c;消息会不断requeue&#xff08;重入队&#xff09;到队列&#xff0c;再重新发送给消费者。…

【陕西】《陕西省省级政务信息化项目投资编制指南(建设类)(试行)》-省市费用标准解读系列07

《陕西省省级政务信息化项目投资编制指南&#xff08;建设类&#xff09;&#xff08;试行&#xff09;》规定了建设类项目的费用投资测算方法与计价标准&#xff0c;明确指出建设类项目费用包括项目建设费和项目建设其他费&#xff08;了解更多可直接关注咨询我们&#xff09;…

VB6.0桌面小程序(桌面音乐播放器)

干货源码 Imports System.IO Imports System.Security.Cryptography Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Button1.Text “上一曲” Button4.Text “播放” Button3.Text “下一曲” Button2.Text “顺序播…

docker安装jdk8

1、拉取镜像 docker pull openjdk:82、运行镜像 docker run -d --restartalways --network portainer_network -it --name jdk8 openjdk:8命令 作用 docker run 创建并启动一个容器 –name jdk8 将容器取名为jdk8 -d 设置后台运行 –restartalways 随容器启动 –network port…

【人工智能】Transformers之Pipeline(二十三):文档视觉问答(document-question-answering)

​​​​​​​ 目录 一、引言 二、文档问答&#xff08;document-question-answering&#xff09; 2.1 概述 2.2 impira/layoutlm-document-qa 2.2.1 LayoutLM v1 2.2.2 LayoutLM v2 2.2.3 LayoutXLM 2.2.4 LayoutLM v3 2.3 pipeline参数 2.3.1 pipeline对象实例化…

微服务day06

MQ入门 同步处理业务&#xff1a; 异步处理&#xff1a; 将任务处理后交给MQ来进行分发处理。 MQ的相关知识 同步调用 同步调用的小结 异步调用 MQ技术选型 RabbitMQ 安装部署 其中包含几个概念&#xff1a; publisher&#xff1a;生产者&#xff0c;也就是发送消息的一方 …

[CKS] K8S RuntimeClass SetUp

最近准备花一周的时间准备CKS考试&#xff0c;在准备考试中发现有一个题目关于RuntimeClass创建和挂载的题目。 ​ 专栏其他文章: [CKS] Create/Read/Mount a Secret in K8S-CSDN博客[CKS] Audit Log Policy-CSDN博客 -[CKS] 利用falco进行容器日志捕捉和安全监控-CSDN博客[CKS…

Halcon基于laws纹理特征的SVM分类

与基于区域特征的 SVM 分类不同&#xff0c;针对图像特征的 SVM 分类的算子不需要直接提取 特征&#xff0c;下面介绍基于 Laws 纹理特征的 SVM 分类。 纹理在计算机视觉领域的图像分割、模式识别等方面都有着重要的意义和广泛的应 用。纹理是指由于物体表面的物理属性不同所…

初始Python篇(6)—— 字符串

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 字符串的常见操作 格式化字符串 占位符 f-string 字符串的 format 方法 字符串的编码与解码 与数据验证相关的方法 …

基于Spring Boot+Vue的养老院管理系统【原创】

一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框架Vue.js&#xff1b;UI库&#xff1a;ElementUI&#xff1b; 开发工具&…

Maven 中央仓库地址 mvnrepository.com

下载一些 jar 包驱动&#xff0c;不需用去官网下了&#xff0c;直接去 Maven 中央仓库&#xff0c;高效、简单 Maven 中央仓库地址 https://mvnrepository.com/open-source 我们下期见&#xff0c;拜拜&#xff01;

2024 年将 Postman 文档导出为 HTML 或 Markdown

2024 年将 Postman 文档导出为 HTML 或 Markdown

Anaconda安装库

相信有些人可能遇到pip直接安装失败&#xff0c;conda直接安装失败&#xff0c;pip镜像安装仍然失败的可能性&#xff0c;下面我记录一下我的一种解决方法。 我使用的是上面的miniconda3配置。 1.创建虚拟环境 首先&#xff0c;先新建一个虚拟环境 conda create -n py39 pyt…

linux命令详解,openssl+历史命令详解

openssl openssl是一个开源的加密工具包&#xff0c;提供了各种加密、解密、签名、验证等功能 openssl passwd -1 123password表示这个命令用于处理密码相关的操作&#xff0c;-1参数指定使用MD5加密算法对密码“123”进行加密处理。MD5是一种常用的哈希算法&#xff0c;它将…