在SQL的查询条件中使用case when取数据

本文介绍如何在SQL查询中运用Case When语句实现动态数据聚合,特别是当需要根据记录数量来决定是否显示汇总数据时。通过具体实例展示了如何结合子查询和条件判断来灵活地获取当前步骤的数据,并提供了当明细条目超过一定数量时计算合计值的方法。

在SQL的查询条件中使用case when取数据

堪称SQL里的ifelse用法

第一步的id是业务信息的id,除第一步外,步骤id最大的表示当前步骤,每次取当前步骤id存入意见表中,:pid表示业务信息id参数例如:

select ID, --唯一标识(与步骤id一致)
       PID, --父id
       FBR --发表人
  from YKSPYJB --审批意见表
 where id = case
         when (select count(1)
                 from r_step a
                where a.process_id = :PID) > 1 then
          (select max(a.id)
             from sys_workflow_r_step a
            where a.process_id = :PID
              and a.id <> :PID)

         else
          (select max(id)
             from r_step a
            where a.process_id = :PID
           --and a.id <> :PID
           )
       end

应用场景:合计语句在查询条数大于6时统计出合计,否则不统计合计数据

这种情况,可以先用union把明细和合计都查出,然后用一个标识区别明细和合计,再类似上面的case when语句条件筛选

select *
  from (select ID px, 
               XMMC, 
               YKDW, 
               to_char(XMZTZ) XMZTZ, 
               BNJH, 
               to_char(YBK) YBK, 
               BYBK, 
               LJBK, 
               PFWH, 
               BZ, 
               1 hj --是否合计
          from YKJHXMMXB --项目明细表
         where PID = :pid
        union
        select 99999999999999 px, 
               '合计' XMMC, 
               '' YKDW, 
               '' XMZTZ, 
               sum(BNJH) BNJH, 
               '' YBK, 
               sum(BYBK) BYBK, 
               sum(LJBK) LJBK, 
               '' PFWH, 
               '' BZ, 
               2 hj --是否合计
          from YKJHXMMXB --项目明细表
         where PID = :pid
         order by px) t
 where t.hj < case
         when (select count(1) from YKJHXMMXB where pid = :pid) > 6 then
          3
         else
          2
       end
<think>嗯,用户明确要求了解SQLCASE WHEN用于条件查询的具体方法。从引用内容看,用户提供的资料已经涵盖了核心用法:引用[2]展示了WHERE子句中的CASE WHEN应用场景,引用[5]则演示了在聚合函数中的经典用法。需要重点整合这两种典型模式。 注意到用户特别强调“条件查询”,这意味着要聚焦WHERE子句中的动态条件构造。引用[2]的例子很有代表性:它用CASE WHEN构建了一个返回0/1的表达式,通过与常量值比较实现复杂筛选。这种技巧能解决常规WHERE无法处理的逻辑分支问题,比如同时处理NULL和非NULL字段的差异化条件。 用户提供的引用[3][4]补充了重要细节:CASE WHENSQL Server中的两种形式(简单vs搜索式),以及处理空值时的注意事项。尤其引用[4]指出,当需要替代iif()或isnull()时,CASE WHEN是更通用的选择。但用户当前需求更偏向条件过滤而非字段转换,所以重点保留引用[2][5]的实践案例。 考虑到用户可能遇到的真实场景,示例设计需要体现三个层级:基础条件分支、多条件组合、含空值的特殊处理。引用[2]的医疗费用区间过滤案例就很实用,稍作扩展就能覆盖常见业务场景。而引用[5]的员工统计案例虽然主要演示聚合,但其中的条件计数思想同样适用于WHERE子句中的存在性判断。 最后需要规避一个常见误区:用户可能误以为CASE WHEN能直接替代WHERE条件(如写成WHERE CASE...END)。必须强调必须将CASE表达式放在等号左侧形成完整条件表达式,如示例中">0"或"=1"的写法。 </think>在SQL使用 `CASE WHEN` 进行条件查询数据的方法主要有以下两种典型场景,结合引用内容详解如下: --- ### 一、在 `WHERE` 子句中筛选数据(动态条件) **核心思路**: 通过 `CASE WHEN` 构造逻辑表达式,返回布尔值(通常用 `1/0` 表示 `True/False`),再通过 `=1` 或其他条件进行筛选(引用[2][3])。 **语法示例**: ```sql SELECT * FROM 表名 WHERE (CASE WHEN 条件1 THEN 1 -- 条件1成立返回1 WHEN 条件2 THEN 1 -- 条件2成立返回1 ELSE 0 -- 否则返回0 END) = 1 -- 筛选结果为1的记录 ``` **实际案例**(引用[2]扩展): ```sql -- 查询医疗费用(monry)在区间(min,max)内的记录 -- 特殊情况:当max为NULL时,只需满足monry > min SELECT * FROM medical_records WHERE ( CASE WHEN max IS NOT NULL AND monry > min AND monry <= max THEN 1 WHEN max IS NULL AND monry > min THEN 1 ELSE 0 END ) = 1; ``` **适用场景**: 需根据**动态条件组合**筛选数据,且条件逻辑复杂无法直接用 `AND/OR` 实现时(如区间判断、空值特殊处理等)。 --- ### 二、在 `SELECT` 子句中动态计算字段 **核心思路**: 直接在 `SELECT` 中使用 `CASE WHEN` 按条件生成新列或转换值(引用[1][5])。 **语法示例**: ```sql SELECT id, name, (CASE WHEN score >= 90 THEN 'A' WHEN score >= 80 THEN 'B' ELSE 'C' END) AS grade -- 生成成绩等级 FROM students; ``` **实际案例**(引用[5]扩展): ```sql -- 统计每个公司男/女员工数量(单次扫描表,避免多表连接) SELECT company, SUM(CASE WHEN gender = 'male' THEN num ELSE 0 END) AS male_count, SUM(CASE WHEN gender = 'female' THEN num ELSE 0 END) AS female_count FROM staff_situation GROUP BY company; ``` **优势**(引用[1][5]): 1️⃣ **性能优化**:避免多表连接或子查询 2️⃣ **可读性提升**:集中处理复杂逻辑 3️⃣ **简化应用层代码**:直接返回结构化数据 --- ### 三、处理空值(`NULL`)的特殊逻辑 结合 `IS NULL` 判断实现空值转换(引用[4]): ```sql SELECT product_id, (CASE WHEN stock IS NULL THEN '缺货' ELSE '有货' END) AS stock_status FROM products; ``` --- ### ⚠️ 关键注意事项 1. **必须完整返回表达式** `WHERE` 子句中的 `CASE WHEN` **不能单独使用**,需与其他条件组合(如 `=1`)。 2. **性能影响** 复杂 `CASE WHEN` 可能降低查询效率,建议在应用层与数据库层权衡逻辑实现位置(引用[1])。 3. **跨数据库兼容性** 所有主流数据库(MySQL, SQL Server, PostgreSQL, Oracle)均支持 `CASE WHEN` 语法。 --- ### 总结对比表 | **应用位置** | **典型场景** | **优势** | 示例引用 | |-----------------|----------------------------------|-----------------------------------|---------------| | **WHERE 子句** | 动态组合过滤条件 | 解决复杂条件分支 | [^2][^3] | | **SELECT 子句** | 字段转换、聚合统计、空值处理 | 提升可读性,避免多表连接 | [^1][^4][^5] | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值