case when 写在where条件中

本文介绍了一个复杂的SQL查询案例,该查询涉及多个表的联接、条件筛选、子查询及复杂的数据映射逻辑,旨在实现对特定业务场景下数据的精细化管理和权限控制。

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

<pre name="code" class="sql">select datas.id,
       datas.name,
       datas.memo,
       to_char(datas.create_date, 'yyyy-mm-dd hh24:mi:ss'),
       to_char(datas.create_date, 'yyyy-mm-dd hh24:mi:ss')
  from t_stl_s_backlog datas,
       (select t.id as id,
               t.stage as stage,
               (case
                 when t.type in ('37', '38') then --  客户信息
                  'CUSTOMER'
                 when t.type in ('39', '40') then -- 项目信息
                  'PROJECT'
                 when t.type in ('41', '42') then -- 租赁物信
                  'LEASEHOLD'
                 when t.type in ('43', '44') then -- 商业机会信息
                  'OPPORTUNITY'
                 when t.type in ('45', '46') then -- 交易信息
                  'TRADEINFO'
                 when t.type in ('47', '48') then -- 交易机会(债券)
                  'TRADINGOPPORTUNITY'
                 when t.type in ('53', '54') then -- 交易机会(贷款)
                  'TRADINGOPPORTUNITYLOAN'
                 when t.type in ('49', '50') then -- 租期检查信息  
                  'LEASECHECK'
                 when t.type in ('51', '52') then -- 质量分类信息
                  'QUALITYCLASSIFY'
                 else
                  'other'
               end) as typeMark
          from t_stl_s_backlog t
         inner join t_stl_s_organization organizati1_
            on t.fk_organization_id = organizati1_.id
         where t.type in ('37',
                          '38',
                          '39',
                          '40',
                          '41',
                          '42',
                          '47',
                          '48',
                          '43',
                          '44',
                          '45',
                          '46',
                          '49',
                          '50',
                          '51',
                          '52',
                          '53',
                          '54')
           and organizati1_.id in
               ('40280c1250ac38680150ac5845f20004',
                '40280c1250ac38680150ac5a74ff0007',
                '40280c1250ac38680150ac5afed20008',
                '40280c66508e2f7e01508e4133ce0000',
                '40280c1250ac38680150ac58235c0003',
                '1',
                '40280c96533a921c01533a9b2be30000',
                '40280c96533a921c01533a9c40fb0001',
                '4028d08154c86e630154c8c5804e0001')
           and to_char(t.end_date, 'yyyy-mm-dd hh24:mi:ss') >=
               '2016-08-24 00:00:00') data1,
       (select nvl(max(a.analyze_customer), 0) as analyze_customer, --客户分析阶段
               nvl(max(a.censor_customer), 0) as censor_customer, --客户审查阶段
               nvl(max(a.compliance_review_project), 0) as compliance_review_project, -- 项目合规审查阶段
               nvl(max(a.dispose_leasehold), 0) as dispose_leasehold, -- 租赁物处置阶段
               nvl(max(a.due_diligence_project), 0) as due_diligence_project, --项目尽职调查阶段
               nvl(max(a.examine_project), 0) as examine_project, -- 项目项目审批阶段
               nvl(max(a.factor_contract), 0),
               nvl(max(a.finish_contract), 0),
               nvl(max(a.initiation_opportunity), 0) as initiation_opportunity, -- 商业机会项目立项阶段
               nvl(max(a.insure_leasehold), 0) as insure_leasehold, -- 租赁物保险阶段
               nvl(max(a.intervene_opportunity), 0) as intervene_opportunity, -- 商业机会前期介入阶段
               nvl(max(a.investigate_customer), 0) as investigate_customer, -- 客户调查阶段
               nvl(max(a.manage_leasehold), 0) as manage_leasehold, -- 租赁物租期管理阶段
               nvl(max(a.prepare_contract), 0),
               nvl(max(a.pricing_leasehold), 0) as pricing_leasehold, -- 租赁物认定及定价阶段
               nvl(max(a.register_leasehold), 0) as register_leasehold, -- 租赁物交接及登记阶段
               nvl(max(a.sign_contract), 0),
               nvl(max(a.sign_project), 0) as sign_project, -- 项目 签约付款阶段
               nvl(max(a.start_contract), 0),
               nvl(max(a.contact_customer), 0) as contact_customer, -- 客户联络阶段
               nvl(max(a.project_start), 0),
               nvl(max(a.review_project), 0) as review_project, -- 项目评审审查阶段
               nvl(max(a.cancel_guarantee_contract), 0),
               nvl(max(a.prepare_guarantee_contract), 0),
               nvl(max(a.sign_guarantee_contract), 0),
               nvl(max(a.commu_trading_opportunity), 0) as commu_trading_opportunity, -- 交易机会沟通阶段
               nvl(max(a.init_trading_opportunity), 0) as init_trading_opportunity, -- 交易机会立项阶段
               nvl(max(a.finish_financing_contract), 0),
               nvl(max(a.prepare_financing_contract), 0),
               nvl(max(a.sign_financing_contract), 0),
               nvl(max(a.credit_apply), 0) as credit_apply, -- 交易授信申请阶段
               nvl(max(a.credit_approve), 0) as credit_approve, -- 交易授信获批阶段
               nvl(max(a.credit_end), 0) as credit_end, -- 交易授信到期阶段
               nvl(max(a.credit_start), 0) as credit_start, -- 交易授信使用阶段
               nvl(max(a.analysis_lease_check), 0) as analysis_lease_check, --  租期检测的分析阶段
               nvl(max(a.analysis_quality_classify), 0) as analysis_quality_classify, -- 质量分类初分阶段
               nvl(max(a.approve_quality_classify), 0) as approve_quality_classify, -- 质量分类中分阶段
               nvl(max(a.execute_lease_check), 0) as execute_lease_check, -- 租期检查执行阶段
               nvl(max(a.plan_lease_check), 0) as plan_lease_check, -- 租期检测的计划阶段
               nvl(max(a.plan_quality_classify), 0) as plan_quality_classify -- 质量分类计划阶段
          from (select qx.*, zjb.user_id as fk_user_id
                  from T_STL_S_POSITION_PRIVILEGE qx,
                       T_STL_S_POSITION           gw,
                       T_STL_S_USER_POSITION      zjb
                 where zjb.user_id = '4028ef8156a07f530156a08b3cb3010b'
                   and zjb.position_id = gw.id
                   and gw.fk_privilege_id = qx.id) a
         group by a.fk_user_id) data2

 where datas.id = data1.id
      -- 建立阶段与岗位权限的映射关系 
   and (case
       -- 客户阶段权限
         when data1.typeMark = 'CUSTOMER' and data1.stage = '1' then -- 开始阶段对应的是客户联络阶段
          data2.contact_customer
         when data1.typeMark = 'CUSTOMER' and data1.stage = '2' then -- 联络阶段对应的是客户联络阶段
          data2.contact_customer
         when data1.typeMark = 'CUSTOMER' and data1.stage = '3' then -- 调查阶段对应的是客户调查阶段
          data2.investigate_customer
         when data1.typeMark = 'CUSTOMER' and data1.stage = '4' then -- 审查阶段对应的是客户审查阶段
          data2.censor_customer
         when data1.typeMark = 'CUSTOMER' and data1.stage = '5' then -- 分析阶段对应的是客户分析阶段
          data2.analyze_customer
         when data1.typeMark = 'CUSTOMER' and data1.stage = '6' then -- 结束阶段对应的是客户分析阶段
          data2.analyze_customer
       -- 项目
         when data1.typeMark = 'PROJECT' and data1.stage = '1' then -- 开始阶段对应的是项目开始阶段
          data2.due_diligence_project
         when data1.typeMark = 'PROJECT' and data1.stage = '2' then -- 尽职调查阶段对应的是项目尽职调查阶段
          data2.due_diligence_project
         when data1.typeMark = 'PROJECT' and data1.stage = '3' then -- 合规审查阶段对应的是项目合规审查阶段
          data2.compliance_review_project
         when data1.typeMark = 'PROJECT' and data1.stage = '4' then -- 评审审查阶段对应的是项目评审审查阶段
          data2.review_project
         when data1.typeMark = 'PROJECT' and data1.stage = '5' then -- 项目审批阶段对应的是项目项目审批阶段
          data2.examine_project
         when data1.typeMark = 'PROJECT' and data1.stage = '6' then -- 签约付款阶段对应的是项目签约付款阶段
          data2.sign_project
         when data1.typeMark = 'PROJECT' and data1.stage = '7' then -- 结束阶段对应的是项目签约付款阶段
          data2.sign_project
       -- 租赁物
         when data1.typeMark = 'LEASEHOLD' and data1.stage = '1' then -- 开始阶段对应的是租赁物认定及定价阶段
          data2.pricing_leasehold
         when data1.typeMark = 'LEASEHOLD' and data1.stage = '2' then -- 认定及定价阶段对应的是租赁物认定及定价阶段
          data2.pricing_leasehold
         when data1.typeMark = 'LEASEHOLD' and data1.stage = '3' then -- 交接及登记价阶段对应的是租赁物交接及登记阶段
          data2.register_leasehold
         when data1.typeMark = 'LEASEHOLD' and data1.stage = '4' then -- 保险价阶段对应的是租赁物保险价阶段
          data2.insure_leasehold
         when data1.typeMark = 'LEASEHOLD' and data1.stage = '5' then -- 租期管理阶段对应的是租赁物租期管理阶段
          data2.manage_leasehold
         when data1.typeMark = 'LEASEHOLD' and data1.stage = '6' then -- 处置阶段对应的是租赁物处置阶段
          data2.dispose_leasehold
         when data1.typeMark = 'LEASEHOLD' and data1.stage = '7' then -- 结束阶段对应的是租赁物处置阶段
          data2.dispose_leasehold
       -- 商业机会  
         when data1.typeMark = 'OPPORTUNITY' and data1.stage = '1' then -- 开始阶段对应的是商业机会前期介入阶段
          data2.intervene_opportunity
         when data1.typeMark = 'OPPORTUNITY' and data1.stage = '2' then -- 前期介入阶段对应的是商业机会前期介入阶段
          data2.intervene_opportunity
         when data1.typeMark = 'OPPORTUNITY' and data1.stage = '3' then -- 项目立项阶段对应的是商业机会项目立项阶段
          data2.initiation_opportunity
         when data1.typeMark = 'OPPORTUNITY' and data1.stage = '4' then -- 结束阶段对应的是商业机会项目立项阶段
          data2.initiation_opportunity
       -- 交易信息    
         when data1.typeMark = 'TRADEINFO' and data1.stage = '1' then -- 开始阶段对应的是交易授信申请阶段
          data2.credit_apply
         when data1.typeMark = 'TRADEINFO' and data1.stage = '2' then -- 授信申请阶段对应的是交易授信申请阶段
          data2.credit_apply
         when data1.typeMark = 'TRADEINFO' and data1.stage = '3' then -- 授信获批阶段对应的是交易授信获批阶段
          data2.credit_approve
         when data1.typeMark = 'TRADEINFO' and data1.stage = '4' then -- 授信使用阶段对应的是交易授信使用阶段
          data2.credit_start
         when data1.typeMark = 'TRADEINFO' and data1.stage = '5' then -- 授信到期阶段对应的是交易授信到期阶段
          data2.credit_end
         when data1.typeMark = 'TRADEINFO' and data1.stage = '6' then -- 结束阶段对应的是交易授信到期阶段
          data2.credit_end
       -- 交易机会 (债券)
         when data1.typeMark = 'TRADINGOPPORTUNITY' and data1.stage = '1' then -- 开始阶段对应的是交易机会沟通阶段
          data2.commu_trading_opportunity
         when data1.typeMark = 'TRADINGOPPORTUNITY' and data1.stage = '2' then -- 沟通阶段对应的是交易机会沟通阶段
          data2.commu_trading_opportunity
         when data1.typeMark = 'TRADINGOPPORTUNITY' and data1.stage = '3' then -- 立项阶段对应的是交易机会立项阶段
          data2.init_trading_opportunity
         when data1.typeMark = 'TRADINGOPPORTUNITY' and data1.stage = '4' then -- 结束阶段对应的是交易机会立项阶段
          data2.init_trading_opportunity
       -- 交易机会 (贷款)  
         when data1.typeMark = 'TRADINGOPPORTUNITYLOAN' and
              data1.stage in ('1', '2', '3') then -- 开始、沟通、结束 阶段对应的是交易机会沟通阶段
          data2.commu_trading_opportunity
       -- 租期检查
         when data1.typeMark = 'LEASECHECK' and
              datas.entity_id =
              (select tsl.id
                 from T_STL_S_LEASE_CHECK tsl, T_STL_S_LEASE_CHECK_USER tslu
                where tsl.id = datas.entity_id
                  and tslu.lease_check_id = tsl.id
                  and tslu.user_id = '4028ef8156a07f530156a08b3cb3010b') and
              data1.stage = '1' then -- 开始阶段对应的是租期检测的计划阶段
          data2.plan_lease_check
         when data1.typeMark = 'LEASECHECK' and
              datas.entity_id =
              (select tsl.id
                 from T_STL_S_LEASE_CHECK tsl, T_STL_S_LEASE_CHECK_USER tslu
                where tsl.id = datas.entity_id
                  and tslu.lease_check_id = tsl.id
                  and tslu.user_id = '4028ef8156a07f530156a08b3cb3010b') and
              data1.stage = '2' then -- 计划阶段对应的是租期检测的计划阶段
          data2.plan_lease_check
         when data1.typeMark = 'LEASECHECK' and
              datas.entity_id =
              (select tsl.id
                 from T_STL_S_LEASE_CHECK tsl, T_STL_S_LEASE_CHECK_USER tslu
                where tsl.id = datas.entity_id
                  and tslu.lease_check_id = tsl.id
                  and tslu.user_id = '4028ef8156a07f530156a08b3cb3010b') and
              data1.stage = '3' then -- 执行阶段对应的是租期检测的执行阶段
          data2.execute_lease_check
         when data1.typeMark = 'LEASECHECK' and
              datas.entity_id =
              (select tsl.id
                 from T_STL_S_LEASE_CHECK tsl, T_STL_S_LEASE_CHECK_USER tslu
                where tsl.id = datas.entity_id
                  and tslu.lease_check_id = tsl.id
                  and tslu.user_id = '4028ef8156a07f530156a08b3cb3010b') and
              data1.stage = '4' then -- 分析阶段对应的是租期检测的分析阶段
          data2.analysis_lease_check
         when data1.typeMark = 'LEASECHECK' and
              datas.entity_id =
              (select tsl.id
                 from T_STL_S_LEASE_CHECK tsl, T_STL_S_LEASE_CHECK_USER tslu
                where tsl.id = datas.entity_id
                  and tslu.lease_check_id = tsl.id
                  and tslu.user_id = '4028ef8156a07f530156a08b3cb3010b') and
              data1.stage = '5' then -- 分析阶段对应的是租期检测的分析阶段
          data2.analysis_lease_check
       --质量分类
         when data1.typeMark = 'QUALITYCLASSIFY' and
              datas.entity_id =
              (select tsq.id
                 from T_STL_S_QUALITY_CLASSIFY      tsq,
                      T_STL_S_QUALITY_CLASSIFY_USER tsqu
                where tsq.id = datas.entity_id
                  and tsqu.quality_classify_id = tsq.id
                  and tsqu.user_id = '4028ef8156a07f530156a08b3cb3010b') and
              data1.stage = '1' then -- 开始阶段对应的是质量分类的计划阶段
          data2.plan_quality_classify
         when data1.typeMark = 'QUALITYCLASSIFY' and
              datas.entity_id =
              (select tsq.id
                 from T_STL_S_QUALITY_CLASSIFY      tsq,
                      T_STL_S_QUALITY_CLASSIFY_USER tsqu
                where tsq.id = datas.entity_id
                  and tsqu.quality_classify_id = tsq.id
                  and tsqu.user_id = '4028ef8156a07f530156a08b3cb3010b') and
              data1.stage = '2' then -- 计划阶段对应的是质量分类的计划阶段
          data2.plan_quality_classify
         when data1.typeMark = 'QUALITYCLASSIFY' and
              datas.entity_id =
              (select tsq.id
                 from T_STL_S_QUALITY_CLASSIFY      tsq,
                      T_STL_S_QUALITY_CLASSIFY_USER tsqu
                where tsq.id = datas.entity_id
                  and tsqu.quality_classify_id = tsq.id
                  and tsqu.user_id = '4028ef8156a07f530156a08b3cb3010b') and
              data1.stage = '3' then -- 初分阶段对应的是质量分类的初分阶段
          data2.analysis_quality_classify
         when data1.typeMark = 'QUALITYCLASSIFY' and
              datas.entity_id =
              (select tsq.id
                 from T_STL_S_QUALITY_CLASSIFY      tsq,
                      T_STL_S_QUALITY_CLASSIFY_USER tsqu
                where tsq.id = datas.entity_id
                  and tsqu.quality_classify_id = tsq.id
                  and tsqu.user_id = '4028ef8156a07f530156a08b3cb3010b') and
              data1.stage = '4' then -- 终分阶段对应的是质量分类的终分阶段
          data2.approve_quality_classify
         when data1.typeMark = 'QUALITYCLASSIFY' and
              datas.entity_id =
              (select tsq.id
                 from T_STL_S_QUALITY_CLASSIFY      tsq,
                      T_STL_S_QUALITY_CLASSIFY_USER tsqu
                where tsq.id = datas.entity_id
                  and tsqu.quality_classify_id = tsq.id
                  and tsqu.user_id = '4028ef8156a07f530156a08b3cb3010b') and
              data1.stage = '5' then -- 结束阶段对应的是质量分类的终分阶段
          data2.approve_quality_classify
       -- 如果上面的条件不满足 则不应该展示数据  
         else
          2
       end) = 1
 order by datas.create_date desc;




                
<think>好的,我现在需要帮助用户理解如何在SQL的WHERE条件中使用CASE WHEN语句。首先,我应该回忆一下CASE WHEN的基本用法。根据引用[2],CASE WHEN有两种形态:一种是直接判断表达式,另一种是根据变量的值进行判断。用户的问题是关于WHERE子句中的应用,所以需要专注于这个部分。 首先,我需要确定在WHERE子句中使用CASE WHEN的常见场景。通常,这可能用于动态过滤条件,根据不同的情况应用不同的条件。比如,当某个字段满足特定条件时,筛选出不同的结果。这时候,CASE WHEN可以生成一个布尔值或者具体的值,然后与外部条件进行比较。 接下来,我需要考虑如何正确构造这样的查询。例如,用户可能希望根据不同的情况动态改变WHERE条件。比如,当参数为1时,筛选status为'active'的记录;当参数为2时,筛选status为'inactive'的记录。这时候可以在WHERE子句中使用CASE WHEN来返回布尔值,或者结合其他条件。 需要注意,CASE WHENWHERE子句中返回的值需要与整个条件表达式的结果相匹配。例如,如果CASE WHEN的结果是一个布尔表达式,可以直接放在WHERE后面。或者,可能需要将CASE WHEN的结果与其他值进行比较,比如等于某个值。 然后,我需要考虑示例。根据引用[2],示例可能包括在SELECT、WHERE、GROUP BY等子句中的使用。对于WHERE子句的例子,可以举一个根据用户输入参数动态改变筛选条件的案例。例如,根据@type参数的不同值,选择不同的筛选条件。 还要注意语法正确性。CASE WHENWHERE子句中应该被正确关闭,即每个WHEN和THEN对应,最后以END结束。同时,可能需要使用括号来确保逻辑正确,避免运算符优先级的问题。 可能出现的错误包括逻辑错误,比如没有正确处理ELSE的情况,导致某些记录被错误地包含或排除。需要提醒用户注意ELSE子句的使用,或者明确处理所有可能的情况。 此外,性能方面的问题也需要考虑。在WHERE子句中使用复杂的CASE WHEN可能会影响查询性能,尤其是在处理大量数据时。需要建议用户进行测试和优化,比如确保有合适的索引。 最后,总结使用步骤:确定动态条件的需求,构造CASE WHEN表达式,确保返回正确的布尔值或比较值,测试不同情况下的结果,优化查询性能。同时,提供具体的示例帮助用户理解。</think>### 如何在 SQL WHERE 条件中使用 CASE WHEN 语句 在 SQL 的 `WHERE` 子句中使用 `CASE WHEN` 主要用于根据条件动态调整筛选逻辑。以下是具体用法和示例: --- #### **1. 基本语法与逻辑** `CASE WHEN` 在 `WHERE` 子句中的作用是生成一个值或布尔表达式,用于动态匹配筛选条件。语法结构如下: ```sql SELECT column1, column2 FROM table WHERE CASE WHEN condition1 THEN result_expression1 WHEN condition2 THEN result_expression2 ... ELSE default_result END = target_value; ``` **关键点**: - `CASE` 表达式最终会返回一个结果(如布尔值、数值或字符串),需与外部条件(如 `=`, `>` 等)结合使用。 - 若直接生成布尔值,可省略外部比较(见示例2)。 --- #### **2. 应用场景与示例** ##### **场景1:动态条件筛选** 根据参数值选择不同的筛选条件。 **示例**:根据用户类型 `@user_type` 的值筛选数据: ```sql SELECT * FROM users WHERE status = CASE WHEN @user_type = 'admin' THEN 'active' -- 管理员筛选活跃用户 WHEN @user_type = 'guest' THEN 'pending' -- 访客筛选待审核用户 ELSE 'inactive' -- 其他情况筛选非活跃用户 END; ``` ##### **场景2:条件组合** 将多个条件通过 `CASE` 合并为单一逻辑。 **示例**:筛选订单金额大于 100 的“已完成”订单,或金额大于 50 的“进行中”订单: ```sql SELECT * FROM orders WHERE CASE WHEN status = 'completed' THEN amount > 100 WHEN status = 'processing' THEN amount > 50 ELSE FALSE END; ``` 此处 `CASE` 直接返回布尔值,无需额外比较[^2]。 ##### **场景3:避免复杂嵌套条件** 简化 `AND/OR` 的嵌套逻辑。 **示例**:根据地区和时间筛选销售记录: ```sql SELECT * FROM sales WHERE region = 'Asia' AND date >= CASE WHEN YEAR(GETDATE()) = 2023 THEN '2023-01-01' ELSE '2020-01-01' END; ``` --- #### **3. 注意事项** 1. **明确返回值类型**:`CASE` 表达式的结果需与外部比较操作符的类型一致(如布尔值、数值等)。 2. **处理 ELSE 分支**:未定义 `ELSE` 时,默认返回 `NULL`,可能导致筛选结果不符合预期。 3. **性能优化**:复杂 `CASE` 可能影响查询效率,建议结合索引使用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值