SQL 中复杂 CASE WHEN 嵌套逻辑优化
目标:优化复杂的 CASE WHEN 逻辑,提升 SQL 语句的可读性与执行效率,减少多层嵌套带来的复杂性。
1. CASE WHEN 的常见问题
- 嵌套过深:多个条件判断嵌套,难以阅读和维护。
- 重复逻辑:相似逻辑在多个分支中重复出现,代码冗余。
- 性能瓶颈:大量嵌套会导致查询执行变慢,特别是在大表中。
2. 需求描述
根据订单金额计算折扣,同时针对不同会员等级提供额外折扣。
- 普通用户:订单金额 ≥ 1000,打9折;金额 < 1000,无折扣。
- VIP 用户:订单金额 ≥ 800,打8折;金额 < 800,打9折。
- SVIP 用户:订单金额 ≥ 500,打7折;金额 < 500,打8折。
3. 示例数据
orders 表结构:
| order_id | user_id | amount | membership_level |
|---|---|---|---|
| 1 | 101 | 1200 | normal |
| 2 | 102 | 700 | vip |
| 3 | 103 | 450 | svip |
| 4 | 104 | 300 | normal |
4. 复杂嵌套 SQL 示例(待优化)
SELECT order_id,user_id,amount,membership_level,CASE WHEN membership_level = 'normal' THEN CASE WHEN amount >= 1000 THEN amount * 0.9ELSE amountENDWHEN membership_level = 'vip' THEN CASE WHEN amount >= 800 THEN amount * 0.8ELSE amount * 0.9ENDWHEN membership_level = 'svip' THEN CASE WHEN amount >= 500 THEN amount * 0.7ELSE amount * 0.8ENDELSE amountEND AS final_amount
FROM orders;
5. 问题分析
- 重复代码:
CASE WHEN逻辑中存在大量重复的条件判断逻辑。 - 嵌套复杂:三个不同会员等级分别嵌套了
CASE,不易维护。
6. 优化策略
- 平铺逻辑:减少嵌套,直接平铺条件。
- 按条件分层:优先判断会员等级,降低嵌套层级。
- 使用 IF 和 IFNULL 简化逻辑:避免多层嵌套。
7. 优化后 SQL 实现
SELECT order_id,user_id,amount,membership_level,amount * CASE WHEN membership_level = 'normal' AND amount >= 1000 THEN 0.9WHEN membership_level = 'vip' AND amount >= 800 THEN 0.8WHEN membership_level = 'vip' AND amount < 800 THEN 0.9WHEN membership_level = 'svip' AND amount >= 500 THEN 0.7WHEN membership_level = 'svip' AND amount < 500 THEN 0.8ELSE 1.0END AS final_amount
FROM orders;
8. 优化亮点
- 单层 CASE:通过合并条件,消除嵌套。
- 性能提升:减少 SQL 扫描逻辑,提高执行效率。
- 代码简洁:结构更清晰,易于阅读和维护。
9. 进一步优化(分层条件逻辑)
SELECT order_id,user_id,amount,membership_level,amount * IFNULL((SELECT discountFROM (SELECT 'normal' AS level, 1000 AS threshold, 0.9 AS discountUNION ALLSELECT 'vip', 800, 0.8UNION ALLSELECT 'vip', 0, 0.9UNION ALLSELECT 'svip', 500, 0.7UNION ALLSELECT 'svip', 0, 0.8) AS discountsWHERE orders.membership_level = discounts.level AND orders.amount >= discounts.thresholdORDER BY threshold DESCLIMIT 1), 1.0) AS final_amount
FROM orders;
10. 解释
- 子查询优化:将折扣条件作为子查询,通过动态匹配减少主查询逻辑复杂度。
- IFNULL 处理默认值:若无匹配条件,返回原始金额
1.0。 - 扩展性强:新增折扣规则时,只需在子查询内新增记录,主查询无需修改。
11. 结果示例
| order_id | user_id | amount | membership_level | final_amount |
|---|---|---|---|---|
| 1 | 101 | 1200 | normal | 1080.00 |
| 2 | 102 | 700 | vip | 630.00 |
| 3 | 103 | 450 | svip | 360.00 |
| 4 | 104 | 300 | normal | 300.00 |
12. 总结
- 复杂
CASE WHEN的嵌套逻辑可以通过平铺逻辑或子查询分层简化,提升 SQL 可读性和执行效率。 - 合理使用
IFNULL和IF减少空值和异常情况带来的错误风险。 - 动态折扣方案可以通过表驱动或子查询方式实现,便于维护和扩展。
相关文章:
SQL 中复杂 CASE WHEN 嵌套逻辑优化
目标:优化复杂的 CASE WHEN 逻辑,提升 SQL 语句的可读性与执行效率,减少多层嵌套带来的复杂性。 1. CASE WHEN 的常见问题 嵌套过深:多个条件判断嵌套,难以阅读和维护。重复逻辑:相似逻辑在多个分支中重复…...
STM32-笔记34-4G遥控灯
4G接线 一、项目需求 服务器通过4G模块远程遥控开关灯。 二、项目实现 复制项目文件夹38-wifi控制风扇项目 重命名为39-4G遥控点灯 打开项目文件 加载文件 main.c #include "sys.h" #include "delay.h" #include "led.h" #include "ua…...
被催更了,2025元旦源码继续免费送
“时间从来不会停下,它只会匆匆流逝。抓住每一刻,我们才不会辜负自己。” 联系作者免费领💖源💖码。 三联支持:点赞👍收藏⭐️留言📝欢迎留言讨论 更多内容敬请期待。如有需要源码可以联系作者免…...
Java(day1)
注释 在Java中注释分为单行注释、多行注释还有文档注释 //我是单行注释/*我 是多行 注释 *//** 我是文档注释*/ 关键字 关键字:是被Java赋予了特定含义的英文单词 特点:关键字的字母都是c 在常用的代码编辑器中关键字都有特殊的高亮标记 在这个里…...
PDF文件提示-文档无法打印-的解决办法
背景信息 下载了几个签名的PDF文件,想要打印纸质版,结果打印时 Adobe Acrobat Reader 提示【文档无法打印】: 解决办法 网上的方案是使用老版本的PDF阅读器, 因为无法打印只是一个标识而已。 PDF文件不能打印的五种解决方案-zhihu 这些方…...
ubuntu操作系统安装SSH服务
1、更新仓库 sudo apt-get update 2、安装SSH服务 #安装SSH服务 apt-get install openssh-server#启用SSH服务 service ssh start#查看SSH服务运行状态 service ssh status 3、修改SSH配置文件 sudo vi /etc/ssh/sshd_config 4、开启ssh端口 sudo ufw allow ssh 5、重启SSH…...
Beamer-LaTeX学习(教程批注版)【1】
该文档总体由beamer-latex的教程而来,由耳东小白以自身学习路径整理。因其中要点基本按照教程的顺序和结构整理,故而不能称之为完全原创,但也不是翻译,更不是抄袭,是个人自学笔记和批注,其中添加了小白个人…...
IIS设置IP+端口号外网无法访问的解决方案
在IIS将站点设置为IP端口访问,假设端口为8080,设好后,服务器上可以访问,外网无法访问。 通常是端口8080没有加入【入站规则】的缘故,将8080端口加入【入站规则】即可,操作如下: 一、ctrlr 输入 …...
Markdown段落的空行缩进用法
Markdown段落的空行缩进用法。 前言语法详解●正文●段落●不分段换行●缩进 使用场景及实例小结其他文章快来试试吧🥰 Markdown段落,分割线的用法 👈点击这里也可查看 前言 段落由一句或多句连续的文本组成,通过一个或多个空行…...
[paddle] 非线性拟合问题的训练
利用paddlepaddle建立神经网络,模拟有限个数据的非线性拟合 本文仍然考虑 f ( x ) sin ( x ) x f(x)\frac{\sin(x)}{x} f(x)xsin(x) 函数在区间 [-10,10] 上固定数据的拟合。 import paddle import paddle.nn as nn import numpy as np import matplotlib.…...
每日一学——监控工具(Grafana)
2.2 Grafana 2.2.1 数据源配置 嘿,各位小伙伴们!既然我们已经有了Prometheus这位超级英雄来帮我们收集数据,那么接下来我们就需要一位艺术家来把这些枯燥的数据变成美丽的图画。这就是Grafana出场的时候了!Grafana是一款非常流行…...
FreshTomato 路由器固件常见配置以及踩坑记录
本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 在上一篇文章《网件 R6400 梅林固件恢复官方固件后刷入 FreshTomato》中,我将网件 R6400 刷入了 FreshTomato 固件,目前已经使用了大半个月了,稳定性比起 380.70_0-X7.9…...
ubuntu 使用samba与windows共享文件[注意权限配置]
在Ubuntu上使用Samba服务与Windows系统共享文件,需要正确配置Samba服务以及相应的权限。以下是详细的步骤: 安装Samba 首先,确保你的Ubuntu系统上安装了Samba服务。 sudo apt update sudo apt install samba配置Samba 安装完成后,…...
使用 httputils + chronicle-bytes 实现金融级 java rpc
1、认识 chronicle-bytes Chronicle-Bytes 是一个类似于 Java NIO 的 ByteBuffer 的高效字节操作库,但它提供了许多扩展功能。这个项目由 OpenHFT 开发并维护,旨在提供高性能、低延迟的数据处理解决方案。Chronicle-Bytes 设计用于高频率交易和其他对性…...
软件工程期末复习(一)
题目复习 单选题 软件产品的核心特性是什么? A. 物质性 B. 逻辑性 C. 可复制性 D. 消耗性 正确答案:B 单选题 在软件开发过程中,哪个环节最接近于传统制造业中的“生产”过程? A. 需求分析 B. 编码 C. 测试 D. 研制(…...
element ui 组件 时间选择器出现转换问题的解决办法
在使用时间选择器添加数据是会出现转换失败问题 vue中代码为: 解决办法: 在el-date-picker中添加 format 和 value-format...
报错:websocket注入为null,已解决!
错误截图 原因分析: WebSocket 在 Spring 框架中的注入问题是由其生命周期与 Spring 容器的作用域不一致引起的。spring管理的都是单例(singleton),和 websocket (多对象)相冲突。如果你的WebSocket 处理类…...
.e01, ..., .e0n的分卷压缩包怎么解压
用BandiZip,这些分卷压缩中还有一个.exe的文件,这个不是可执行文件,是一个解压缩的开头。 安装好bandiZip后,右键这个.exe文件 点击打开就是开始解压了: 最后解压后是这些。然后一个个再次解压....
四年前的计划,青涩但坚韧
回看四年前写的目标,做的计划,特别感慨,当时的我无法想到现在正在做的事情。 一个契机,群里有个朋友说在写五年规划,让我想到五年前刚毕业不久也写过类似的东西,当时写的是三年学习计划,那是202…...
【人工智能】人工智能与大模型
人工智能与大模型的结合正在深刻改变多个行业和领域的格局。 1. 人工智能 (AI) 人工智能指的是使计算机或机器具备模拟人类智能的能力,包括学习、推理、问题解决、自然语言处理、视觉感知等。AI的发展可以分为几个阶段: 弱人工智能 (Narrow AI)&#…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
