sql语句中 order by利用case when实现排序(简单使用)

sql语句中 order by利用case when实现排序(简单使用)**

SQL语句

按照特定条件对结果进行排序,这段sql意思是只对APP_CODE等于aa的排序 ,TODO_EMERGY=30 的放在第一位,等于20的放在第2位, 剩下的数据按照时间降序排序。(比较简单的使用,when里还可以使用比较复杂的嵌套sql)

select * from sy_todo order by CASE
WHEN APP_CODE='aa' AND TODO_EMERGY =30 THEN 1
WHEN APP_CODE='aa' AND TODO_EMERGY =20 THEN 2
ELSE 3 END, TIME DESC

博主也是个菜鸟,第一次发一起学习吧

<think>我们正在讨论SQL嵌套CASEWHEN的语法和用法。用户之前的问题是关于SQL中的IF-ELSE逻辑,现在转向嵌套CASE WHEN。根据引用,我们知道CASE表达式在SQL查询中用于条件逻辑,并且可以嵌套使用嵌套CASEWHEN是指在CASE表达式的THEN或ELSE部分中再嵌套另一个CASE表达式。这种结构用于处理更复杂的条件分支。基本语法结构: ```sqlCASEWHEN condition1 THENCASEWHENsub_condition1THEN result1WHENsub_condition2THEN result2ELSEdefault_result1ENDWHENcondition2THEN result2ELSECASEWHEN sub_condition3 THENresult3ELSE default_result2ENDEND``` 或者,也可以在THEN后面直接嵌套一个CASE表达式,但注意每个THEN后面只能有一个表达式,因此嵌套CASE表达式必须完整。 示例:假设我们有一个员工表(employees),包含salary(薪水)和performance_rating(绩效评级)字段。我们需要根据薪水和绩效计算奖金(bonus):-如果绩效评级为1,则奖金为薪水的20%;-如果绩效评级为2,则根据薪水范围进一步细分:-薪水小于5000,奖金为薪水的15%-薪水在5000到10000之间,奖金为薪水的10%-薪水大于10000,奖金为薪水的5% -其他绩效评级,奖金为0。 使用嵌套CASE WHEN实现:```sqlSELECTemployee_id,salary,performance_rating,CASE performance_ratingWHEN1 THENsalary *0.2WHEN2 THENCASEWHENsalary <5000 THENsalary *0.15WHENsalary BETWEEN5000 AND10000 THENsalary *0.1WHENsalary >10000 THENsalary *0.05ELSE0--虽然这里不会触发,但为了完整性ENDELSE0END ASbonusFROM employees; ```注意事项: 1.嵌套CASE表达式必须完整,即每个嵌套CASE必须有END结束。 2.注意缩进和格式,以保持可读性。3.嵌套的层数不宜过多,否则会降低可读性和性能。如果嵌套层数过多,可以考虑使用存储过程或重构逻辑。4.每个CASE表达式都可以有自己的ELSE子句,如果没有ELSE且所有条件都不满足,则返回NULL。另一个例子:在WHERE子句中使用嵌套CASE(虽然不常见,但有时有用)```sqlSELECT *FROM ordersWHERECASEWHENstatus= 'Shipped'THENCASEWHEN ship_date >'2023-01-01' THEN1ELSE0ENDWHEN status= 'Processing'THENCASEWHEN order_date >'2023-01-01'THEN1ELSE0ENDELSE0END=1;``` 这个查询选择满足特定条件的订单:如果是已发货状态,则检查发货日期是否在2023-01-01之后;如果是处理中状态,则检查订单日期是否在2023-01-01之后。注意,这种写法可能不如使用AND/OR组合条件清晰,但展示了在WHERE子句中使用嵌套CASE的可能性。 性能考虑:-嵌套CASE WHEN可能会导致性能下降,尤其是在处理大量数据时,因为每一行都需要逐层判断条件。-尽量将最可能满足的条件放在前面,以减少判断次数。-避免在条件中写复杂的子查询。 最后,引用[2]中提到IN子查询的执行方式,虽然与嵌套CASE WHEN无直接关系,但提醒我们注意SQL语句的执行效率。在嵌套CASEWHEN中,如果条件里包含子查询,要特别小心,因为可能会被多次执行(具体取决于数据库优化器)。通常,应避免在CASE条件中使用子查询,或者确保子查询是高效的。 §§相关问题§§1.嵌套CASEWHEN使用多个CASE表达式在性能上有何区别? 2.如何在CASE WHEN条件中使用子查询?3.嵌套CASE WHEN的最大层数限制是多少?4.在哪些数据库系统中不支持嵌套CASEWHEN?</think>### SQL嵌套CASE WHEN的语法与用法详解 在SQL中,嵌套`CASE WHEN`允许实现多层条件逻辑,特别适合处理复杂的分支判断。以下是完整语法和实用示例: #### 基础语法结构 ```sql SELECT CASE WHEN condition1 THEN CASE WHEN sub_condition1 THEN result1 WHEN sub_condition2 THEN result2 ELSE default_result1 END WHEN condition2 THEN result2 ELSE CASE WHEN sub_condition3 THEN result3 ELSE default_result2 END END AS result_column FROM table_name ``` #### 核心特性 1. **多层嵌套**:在`THEN`或`ELSE`中嵌入新`CASE`表达式 2. **独立作用域**:每个嵌套`CASE`有独立的`WHEN-THEN-ELSE`结构 3. **必须完整**:每个`CASE`必须用`END`关闭 4. **类型一致性**:所有分支返回的数据类型需兼容[^3] --- ### 实战示例场景 #### 示例1:员工奖金计算(三层嵌套) ```sql SELECT employee_id, salary, CASE WHEN department = 'Sales' THEN CASE WHEN experience_years > 5 THEN salary * 0.15 WHEN experience_years BETWEEN 2 AND 5 THEN salary * 0.1 ELSE salary * 0.05 END WHEN department = 'Engineering' THEN CASE WHEN project_count > 3 THEN salary * 0.12 ELSE salary * 0.08 END ELSE salary * 0.03 END AS bonus FROM employees; ``` **逻辑解析**: 1. 先按部门分支 2. 销售部根据工龄细分奖金比例 3. 工程部根据项目数细分 4. 其他部门统一3% #### 示例2:学生成绩分级(WHERE子句嵌套) ```sql SELECT student_id, score, CASE WHEN score >= 90 THEN 'A' WHEN score >= 80 THEN CASE WHEN attendance > 90 THEN 'B+' ELSE 'B' END WHEN score >= 70 THEN CASE WHEN club_member = 1 THEN 'C+' ELSE 'C' END ELSE 'F' END AS final_grade FROM exam_results WHERE CASE WHEN semester = 'Fall' THEN score > 65 WHEN semester = 'Spring' THEN score > 60 ELSE score > 70 END; ``` **嵌套亮点**: - SELECT子句:成绩分级中加入出勤率和社团活动判断 - WHERE子句:根据学期动态调整及格线[^1] --- ### 最佳实践与注意事项 1. **缩进规范**(推荐格式): ```sql CASE WHEN cond1 THEN CASE WHEN sub_cond1 THEN ... -- 缩进4空格 WHEN sub_cond2 THEN ... END END ``` 2. **性能优化**: - 将**高频条件**放在外层`WHEN`的前面 - 避免超过3层嵌套(可改用存储过程) - 在`WHERE`中使用嵌套时,确保条件可走索引[^2] 3. **常见错误防范**: ```sql -- 错误:缺少END CASE WHEN a>10 THEN CASE WHEN b>5 THEN 1 -- 缺少END END -- 错误:类型不一致 CASE WHEN cond1 THEN 'Text' WHEN cond2 THEN 100 -- 文本与数字混用 END ``` 4. **数据库差异处理**: - **Oracle**:支持全角符号但不推荐[^3] - **MySQL**:可用`IF()`简化二元嵌套 ```sql SELECT IF(score>80, IF(attendance>90, 'A+', 'A'), 'B') FROM students; ``` - **SQL Server**:可用`IIF()`替代简单嵌套 --- ### 嵌套CASE vs 存储过程选择 | 场景 | 推荐方案 | |--------------------------|--------------------| | 简单条件转换(≤3层) | 嵌套CASE | | 需复用逻辑 | 存储过程 | | 涉及数据修改操作 | 存储过程IF-ELSE | | 动态SQL生成 | 嵌套CASE + 应用层 | > 当嵌套层级超过3层时,建议改用存储过程的`IF-ELSE`结构,可显著提升可读性和维护性[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值