sql数据库 转 Access SQL语句改写之 Case When Then When Then Else End 修改篇

本文介绍了一种使用iif和switch函数优化复杂SQL查询的方法,通过对比修改前后的SQL语句,展示了如何更简洁有效地进行条件判断和计算。

修改前

SELECT SUM(sum_m) as sum_m,  SUM(mem_result) as mem_result, SUM(mem_ds) as mem_ds , SUM(ag_ds) as ag_ds,zong_ds = isnull(SUM(zong_ds), 0), re = COUNT(*) FROM (SELECT sum_m,mem_ds = CASE WHEN banlance = 0 or amount='Alls' THEN 0 ELSE sum_m * rake / 100 END, mem_result = CASE WHEN banlance = 0 or amount='Alls' THEN 0 ELSE CASE WHEN result = 0 THEN - sum_m WHEN result > 0 THEN (CASE WHEN sort = 'likst' THEN sum_m / count_l* rate * result - sum_m ELSE sum_m * (rate - 1) END) END END, ag_ds = CASE WHEN banlance = 0 or amount='Alls' THEN 0 ELSE sum_m * dai_ds / 100 END, zong_ds = CASE WHEN banlance = 0 or amount='Alls' THEN 0 ELSE sum_m * zong_ds / 100 END  from table

修改后

SELECT SUM(sum_m) as sum_m,  SUM(mem_result) as mem_result, SUM(mem_ds) as mem_ds , SUM(ag_ds) as ag_ds,iif(isnull(SUM(zong_ds)),0,Sum(zong_ds)) as zong_ds1, COUNT(*) as re FROM (SELECT sum_m,iif((banlance = 0 or amount='Alls'),0,sum_m * rake / 100) as mem_ds,iif(( banlance = 0 or amount='Alls'  ),0,switch(result=0,-sum_m,result>0,iif(sort='likst',(sum_m / count_l* rate * result - sum_m),sum_m * (rate - 1)))) as mem_result ,iif(banlance = 0 or amount='Alls' ,0 , sum_m * dai_ds / 100 ) as ag_ds ,iif( banlance = 0 , 0, sum_m * zong_ds / 100 ) as  zong_ds from table

主要用到2个函数 一个 iif  一个 swith

iif(expr,value1,value2)

iif means 

if expr then value1 else value2

switch   函数
计算一组表达式列表的值,然后返回与表达式列表中最先为   true   的表达式所相关的   variant   数值或表达式。      
语法  
  switch(expr-1,   value-1[,   expr-2,   value-2   _   [,   expr-n,value-n]])     
  switch   函数的语法具有以下几个部分:  
  部分   描述    
  expr   必要参数。要加以计算的   variant   表达式。    
  value   必要参数。如果相关的表达式为   true,则返回此部分的数值或表达式。   
  说明    
  switch   函数的参数列表由多对表达式和数值组成。表达式是由左至右加以计算的,而数值则会在第一个相关的表达式为   true   时返回。如果其中有部分不成对,则会产生一个运行时错误。如果   expr-1   为   true   则   switch   返回   value-1,如果   expr-1   为   false,但   expr-2   为   true,则   switch   返回   value-2,以此类推。


时间比较  记得 用# 替换'

SQL 中的 `CASE WHEN THEN ELSE END` 是一种条件表达式,允许在查询中实现复杂的逻辑判断和结果返回。这种结构类似于编程语言中的 `if-else` 语句,适用于对数据进行分类、换或计算。 ### 基本语法 ```sql CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... ELSE default_result END ``` 其中: - `WHEN condition`:定义一个条件判断。 - `THEN result`:当条件为真时返回的结果。 - `ELSE default_result`:可选部分,当所有条件都不满足时返回的默认值。 - `END`:结束整个 `CASE` 表达式。 --- ### 使用方式详解 #### 1. 简单 `CASE` 表达式(基于值匹配) 简单 `CASE` 表达式用于将某一列的值与多个固定值进行比较,并返回对应的结果。例如,在引用[1]中展示了一个简单的评分系统: ```sql SELECT CASE SCORE WHEN 'A' THEN '优' WHEN 'B' THEN '良' WHEN 'C' THEN '中' ELSE '不及格' END AS grade FROM scores; ``` 此查询将字母等级映射为中文描述。如果 `SCORE` 列的值是 `'A'`,则返回 `'优'`;如果是 `'B'`,则返回 `'良'`,依此类推[^1]。 #### 2. 搜索型 `CASE` 表达式(基于条件判断) 搜索型 `CASE` 表达式允许使用更灵活的布尔表达式来定义条件。例如: ```sql SELECT CASE WHEN salary > 10000 THEN '高薪' WHEN salary BETWEEN 5000 AND 10000 THEN '中等薪资' ELSE '低薪' END AS salary_level FROM employees; ``` 该查询根据员工薪资水平将其分为三类:高薪、中等薪资和低薪。这种方式比简单 `CASE` 更加灵活,适用于范围判断或多条件组合场景[^4]。 #### 3. 在 `CHECK` 约束中使用 `CASE` `CASE` 表达式也可用于表约束中,以实现复杂的数据完整性控制。例如,在引用[3]中提到的例子中,公司规定女性员工的工资必须高于 1000 元: ```sql ALTER TABLE employees ADD CONSTRAINT check_salary CHECK ( CASE WHEN sex = '2' THEN CASE WHEN salary > 1000 THEN 1 ELSE 0 END ELSE 1 END = 1 ); ``` 这个约束确保只有当性别为女性(假设 `'2'` 表示女性)时,工资必须大于 1000 元;对于其他性别,则不做限制[^3]。 #### 4. `CASE` 与聚合函数结合使用 在数据分析中,`CASE` 经常与聚合函数一起使用,以实现分组统计。例如: ```sql SELECT department, COUNT(*) AS total_employees, SUM(CASE WHEN salary > 8000 THEN 1 ELSE 0 END) AS high_salary_count FROM employees GROUP BY department; ``` 该查询统计每个部门的总人数以及薪资高于 8000 的员工数量。通过 `CASE` 表达式,可以动态生成新的逻辑列并参与聚合运算[^4]。 --- ### 注意事项 - **优先级问题**:`CASE` 表达式一旦找到第一个满足条件的分支,就会立即返回结果,后续的条件将被忽略。因此,条件顺序非常重要。 - **性能影响**:虽然 `CASE` 提供了灵活性,但在大数据集上频繁使用可能会影响查询性能,尤其是在嵌套多层 `CASE` 时。 - **别名命名**:使用 `AS` 关键字为 `CASE` 表达式的结果命名,有助于提升查询的可读性。 --- ### 示例代码总结 以下是一个综合示例,展示如何在实际查询中使用 `CASE` 表达式: ```sql SELECT employee_id, name, salary, CASE WHEN salary > 10000 THEN 'High' WHEN salary BETWEEN 6000 AND 10000 THEN 'Medium' ELSE 'Low' END AS salary_category, CASE gender WHEN 'M' THEN 'Male' WHEN 'F' THEN 'Female' ELSE 'Other' END AS gender_full FROM employees; ``` 此查询将薪资划分为三个类别,并将性别字段从缩写换为完整表述。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值