sql case when

本文介绍了一个具体的SQL查询案例,展示了如何使用CASE WHEN语句来转换字段值,并通过连接操作将客户信息表与员工表结合起来。该查询关注于特定仓库条件下的客户数据,包括客户的地区、编号、名称、业务类型、创建时间和是否锁定状态等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

select t1.mainregion 运作地,
       t1.customercode 客户编号,
       t1.customernamecn 名称,
       --t1.businesstype,
       case when t1.businesstype = 'IMP' then '进口'
            when t1.businesstype = 'EXP' then '出口'
            when t1.businesstype = 'SAL' then '销售'
            when t1.businesstype = 'TRS' then '物流'
            end businesstype,
       t1.createdate 创建时间,
       e.name 商务经理,
       'tel:' || e.telephone || ' mobile:' || e.mobilephone tel,
       case when t1.islock = 'N' then '否'
            when t1.islock = 'Y' then '是'
            end islock
  from eapt_customer t1, employee e
 where (t1.warehouseftcout = 56
    or t1.warehouseftcin = 56) and e.username = t1.principal2 
<think>我们正在讨论SQL中的CASE WHEN表达式,这是一种条件表达式,用于在查询中根据条件返回不同的值。根据引用内容,CASE WHEN有两种形式:简单CASE表达式和搜索CASE表达式。我们将分别介绍这两种形式,并提供多个使用场景的示例。 ### 1. 简单CASE表达式 简单CASE表达式将一个表达式与一组简单表达式进行比较以确定结果。其语法如下: ```sql CASE input_expression WHEN when_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END ``` **示例1:** 根据性别代码返回性别描述 ```sql SELECT name, gender_code, CASE gender_code WHEN 'M' THEN '男' WHEN 'F' THEN '女' ELSE '未知' END AS gender_desc FROM employees; ``` ### 2. 搜索CASE表达式 搜索CASE表达式允许使用更复杂的条件(包括比较运算符和逻辑运算符)。其语法如下: ```sql CASE WHEN boolean_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END ``` **示例2:** 根据成绩分数划分等级 ```sql SELECT student_name, score, CASE WHEN score >= 90 THEN 'A' WHEN score >= 80 THEN 'B' WHEN score >= 70 THEN 'C' WHEN score >= 60 THEN 'D' ELSE 'F' END AS grade FROM exam_results; ``` ### 常用场景示例 #### 场景1:多目标字段统计(引用[1]场景2) 在统计中使用CASE WHEN进行条件计数或求和。 **示例3:** 统计不同分数段的学生人数 ```sql SELECT class_id, COUNT(*) AS total_students, SUM(CASE WHEN score >= 90 THEN 1 ELSE 0 END) AS A_count, SUM(CASE WHEN score >= 80 AND score < 90 THEN 1 ELSE 0 END) AS B_count, SUM(CASE WHEN score >= 70 AND score < 80 THEN 1 ELSE 0 END) AS C_count, SUM(CASE WHEN score < 70 THEN 1 ELSE 0 END) AS fail_count FROM exam_results GROUP BY class_id; ``` #### 场景2:行转列(引用[1]场景3) 将行数据转换为列(即数据透视)。 **示例4:** 将不同产品的销售金额按季度转换为列 ```sql SELECT product_id, SUM(CASE WHEN quarter = 'Q1' THEN amount ELSE 0 END) AS Q1_amount, SUM(CASE WHEN quarter = 'Q2' THEN amount ELSE 0 END) AS Q2_amount, SUM(CASE WHEN quarter = 'Q3' THEN amount ELSE 0 END) AS Q3_amount, SUM(CASE WHEN quarter = 'Q4' THEN amount ELSE 0 END) AS Q4_amount FROM sales GROUP BY product_id; ``` #### 场景3:在UPDATE语句中使用CASE WHEN(引用[2]) 根据条件更新表中的数据。 **示例5:** 根据销售额调整员工奖金 ```sql UPDATE employees SET bonus = CASE WHEN sales > 100000 THEN 5000 WHEN sales > 50000 THEN 2000 ELSE 500 END; ``` #### 场景4:在ORDER BY中使用CASE WHEN(引用[1]未提及) 根据条件自定义排序规则。 **示例6:** 优先显示特定状态的数据 ```sql SELECT * FROM orders ORDER BY CASE status WHEN '紧急' THEN 1 WHEN '高' THEN 2 WHEN '中' THEN 3 WHEN '低' THEN 4 ELSE 5 END; ``` #### 场景5:在HAVING子句中使用CASE WHEN(引用[1]未提及) 对分组后的结果进行条件过滤。 **示例7:** 筛选出至少有一个A等级且没有不及格的班级 ```sql SELECT class_id FROM exam_results GROUP BY class_id HAVING SUM(CASE WHEN grade = 'A' THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN grade = 'F' THEN 1 ELSE 0 END) = 0; ``` ### 注意事项 1. **ELSE子句**:如果省略ELSE,则所有条件都不满足时返回NULL。 2. **条件顺序**:条件按顺序判断,一旦满足则返回结果并停止后续判断。 3. **数据类型**:所有结果表达式必须返回相同或兼容的数据类型。 4. **性能**:在大型数据集上使用复杂CASE WHEN可能影响性能,需合理使用索引。 ### 不同数据库的兼容性 - **MySQLSQL Server、PostgreSQL**:支持上述两种形式的CASE表达式。 - **Oracle**:同样支持,语法相同。 ### 总结 CASE WHENSQL中强大的条件表达式工具,可用于SELECT、UPDATE、ORDER BY等子句中,实现复杂的条件逻辑。通过灵活运用,可以解决数据转换、条件统计、动态排序等多种问题[^1][^2][^3]。 §§相关问题§§ 1. 在SQL中如何用CASE WHEN实现多条件分支判断? 2. CASE WHEN在数据透视(行转列)中的应用有哪些限制? 3. 如何优化包含多个CASE WHEN子句的SQL查询性能? 4. CASE WHEN与IF语句在SQL中的区别是什么?</think>### SQL CASE WHEN 用法详解 `CASE WHEN` 是 SQL 中实现条件逻辑的核心表达式,支持多条件分支判断和值转换。以下是两种主要形式及典型应用场景: --- ### 一、两种语法形式 #### 1. **简单 CASE 表达式** 直接匹配字段值: ```sql SELECT column1, CASE column_name WHEN value1 THEN result1 WHEN value2 THEN result2 ELSE default_result END AS new_column FROM table; ``` **示例**:将数字状态码转为文本描述 ```sql SELECT order_id, CASE status WHEN 1 THEN '待付款' WHEN 2 THEN '已发货' WHEN 3 THEN '已完成' ELSE '未知状态' END AS status_desc FROM orders; ``` #### 2. **搜索 CASE 表达式** 支持复杂条件判断(推荐): ```sql SELECT CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ELSE default_result END AS new_column FROM table; ``` **示例**:根据成绩分级 ```sql SELECT student_name, CASE WHEN score >= 90 THEN 'A' WHEN score >= 80 THEN 'B' WHEN score >= 60 THEN 'C' ELSE 'D' END AS grade FROM exam_scores; ``` --- ### 二、5 大应用场景 #### ▶ 场景 1:多条件字段统计(引用[1]场景2) **需求**:统计不同分数段人数 ```sql SELECT COUNT(*) AS total, SUM(CASE WHEN score >= 90 THEN 1 ELSE 0 END) AS A_count, SUM(CASE WHEN score >= 80 AND score < 90 THEN 1 ELSE 0 END) AS B_count, SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS fail_count FROM students; ``` #### ▶ 场景 2:行转列透视(引用[1]场景3) **需求**:按季度展示产品销售额 ```sql SELECT product_id, SUM(CASE WHEN quarter = 'Q1' THEN amount ELSE 0 END) AS Q1_sales, SUM(CASE WHEN quarter = 'Q2' THEN amount ELSE 0 END) AS Q2_sales, SUM(CASE WHEN quarter = 'Q3' THEN amount ELSE 0 END) AS Q3_sales FROM sales GROUP BY product_id; ``` #### ▶ 场景 3:多级审批状态判断(引用[3]) **需求**:根据审批节点判断状态 ```sql SELECT contract_id, CASE WHEN purchase_dept_approve = '否' THEN '终止' WHEN legal_approve = '否' THEN '终止' WHEN finance_director_approve = '是' THEN '完成' ELSE '审批中' END AS approval_status FROM purchase_contracts; ``` #### ▶ 场景 4:结合聚合函数条件统计 **需求**:统计不同部门男女员工数量 ```sql SELECT department, COUNT(CASE WHEN gender = 'M' THEN 1 END) AS male_count, COUNT(CASE WHEN gender = 'F' THEN 1 END) AS female_count FROM employees GROUP BY department; ``` #### ▶ 场景 5:数据清洗与转换 **需求**:规范手机号格式 ```sql UPDATE users SET phone = CASE WHEN LEN(phone) = 11 THEN '+86' + phone WHEN phone LIKE '0086%' THEN REPLACE(phone,'0086','+86') ELSE phone END; ``` --- ### 三、性能优化建议 1. **优先使用搜索表达式** 简单 CASE 仅支持等值匹配,搜索表达式支持复杂逻辑(如 `>`, `<`, `LIKE`)[^2] 2. **减少嵌套层级** 多层嵌套影响可读性和性能,可通过拆分查询优化 3. **注意条件顺序** 按条件筛选概率从高到低排列,命中后立即返回结果 4. **避免在 WHERE 中直接使用** 可能导致索引失效,改用派生表: ```sql SELECT * FROM ( SELECT *, CASE ... END AS flag FROM table ) t WHERE flag = 1; ``` --- ### 四、跨数据库兼容性 | 功能 | MySQL | SQL Server | PostgreSQL | Oracle | |------------------|-------|------------|------------|--------| | 简单 CASE | ✓ | ✓ | ✓ | ✓ | | 搜索 CASE | ✓ | ✓ | ✓ | ✓ | | CASE 中聚合函数 | ✓ | ✓ | ✓ | ✓ | | CASE 中子查询 | ✓ | ✓ | ✓ | ⚠️ 有限制 | > ⚠️ Oracle 中需避免在 CASE 内使用返回多行的子查询 --- ### 总结 `CASE WHEN` 的核心价值在于: 1. 实现 **字段级条件分支**(替代程序逻辑) 2. 完成 **数据透视转换**(行转列) 3. 进行 **数据清洗标准化** 4. 支持 **动态结果生成** 通过结合聚合函数和子查询,可解决复杂业务场景下的数据加工需求[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值