ORACLE的CASE WHEN以不同列作为条件查询

本文介绍了Oracle SQL中CASE WHEN的多种用法,包括简单用法、作为条件语句(以字段结果和字段名作为条件)、在UPDATE语句中的应用及作为串表条件。在使用中,注意CASE WHEN的条件字段应置于外部,结果放在内部,同时讨论了如何在固定表结构下处理动态查询需求。

之前好几次做看板的时候,在使用ORACLE的case when时,一直找不到合适的例子,大多数的用法都是对查询的结果以case when 作为条件筛选,但是实际上很多条件或者串表的地方也是可以用到case when作为使用的手段的。
以下就罗列以下使用的类型:

一.简单CASE WHEN 的用法

此方法是case when的一般用法,平常也是用的最多的,有2种语法,凭个人喜好使用:

--简单Case函数
select
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END as "性别"
from dual;

--Case搜索函数
select
CASE
WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END as "性别"
from dual;

然后需要注意的是查询出来的类型,保证不同的then结果都是统一number或者char类型,否则会报类型不一致错误。

二.CASE WHEN 作为条件语句(以某个字段的结果作为条件)

举例:如果车间名称叫做’ICC AA’的,就把2020年的数据拉出来来,否则其他车间,全部只要2019年的数据。
1.先看下以错误写法:
在这里插入图片描述
以case when 作为查询的写法写在条件中,会报缺少关键字,具体原因没查过,但是总结的经验就是,查询的条件字段都必须放在case when外面,case when 中只能放结果。

2.如下图,将条件字段YEAR放在前面,条件结果放在case when 里面就正确了:

select *
      from table_name
     where column_name1= 
<think>嗯,用户问的是Oracle查询条件中使用CASE WHEN的情况。首先,我得回忆一下CASE WHENSQL中的常见用法,尤其是在WHERE子句中的应用。通常,CASE WHEN用于条件判断,返回同的值。但在WHERE子句里,可能需要结合其他逻辑来动态生成条件。 首先,用户可能是在编写查询时遇到了需要根据条件动态筛选数据的情况。比如,可能有一个参数,根据这个参数的同值,查询条件会变化。这时候,使用CASE WHEN可能是一个解决方案。 过,要注意的是,直接在WHERE子句中使用CASE WHEN可能会导致性能问题,因为可能会影响索引的使用。另外,写法上可能需要更复杂的逻辑,比如将CASE WHEN的结果与某个值比较,或者结合布尔表达式。 比如,用户可能想根据同的情况应用同的过滤条件。例如,当某个参数为1时,筛选状态为'active',参数为2时,筛选创建日期在最近一周内的记录。这时候,可能需要用CASE WHEN生成同的条件,然后与TRUE比较,或者在条件中组合同的逻辑。 然后,我需要考虑如何正确构造这样的查询。例如,使用CASE WHEN在WHERE子句中,每个分支返回一个布尔表达式,然后整个CASE的结果必须是一个布尔值。但Oracle的WHERE子句需要的是条件表达式,所以可能需要将CASE WHEN的结果与某个值比较,或者使用其他方式。 或者,可能用户更倾向于使用动态SQL,根据同的条件拼接同的WHERE子句,这样可能更高效。但用户特别询问的是CASE WHEN的用法,所以需要给出相应的例子。 另外,可能需要提醒用户注意CASE WHEN在WHERE子句中的使用场景和潜在的性能影响,尤其是在处理大数据量时,确保索引能够被有效利用。 总结一下,用户的需求可能是在Oracle查询中根据同的条件动态改变WHERE子句的条件,使用CASE WHEN来实现这一点。需要提供具体的示例,说明如何正确使用CASE WHEN,同时指出可能的替代方案和注意事项。</think>在Oracle SQL中,`CASE WHEN`语句可以用于查询条件的动态构造,通常结合`WHERE`子句实现按条件筛选数据。以下是具体用法和示例: --- ### 一、基础用法 当需要根据条件动态生成筛选逻辑时,可以将`CASE WHEN`嵌入`WHERE`子句: ```sql SELECT * FROM employees WHERE CASE WHEN :input_param = 'active' THEN CASE WHEN status = 'active' THEN 1 ELSE 0 END WHEN :input_param = 'recent' THEN CASE WHEN hire_date > SYSDATE - 7 THEN 1 ELSE 0 END ELSE 1 END = 1; ``` **说明**: - `:input_param`是外部传入的参数 - 根据参数值同,动态选择`status`或`hire_date`作为筛选条件 - `ELSE 1`表示默认返回所有数据 --- ### 二、更简化的布尔表达式 直接返回布尔结果,避免多层`CASE`嵌套: ```sql SELECT * FROM products WHERE (CASE WHEN category = 'Electronics' THEN price > 1000 WHEN category = 'Clothing' THEN stock > 50 ELSE discount IS NOT NULL END) = TRUE; ``` **特点**: - 每个`WHEN`分支直接返回布尔值 - 最终通过`= TRUE`明确条件判断 --- ### 三、与常规条件混合使用 可与其他筛选条件组合: ```sql SELECT order_id, total_amount FROM orders WHERE order_date >= DATE '2023-01-01' AND (CASE WHEN :region = 'North' THEN customer_state IN ('NY','MA') WHEN :region = 'South' THEN customer_state IN ('TX','FL') ELSE 1=1 END); ``` **逻辑**: - 固定筛选2023年后的订单 - 根据`:region`参数动态选择州范围 --- ### 四、性能注意事项 1. **索引影响**:`CASE WHEN`可能导致索引失效,建议对高频查询字段建立函数索引 ```sql CREATE INDEX idx_emp_status ON employees (CASE WHEN status = 'active' THEN 1 ELSE 0 END); ``` 2. **替代方案**:复杂条件建议改用`UNION ALL`或动态SQL ```sql -- 使用UNION ALL优化 SELECT * FROM table WHERE condition1 UNION ALL SELECT * FROM table WHERE condition2 ``` --- ### 五、典型应用场景 1. 多条件动态过滤(如报表参数化查询) 2. 同一字段同区间段的差异化筛选 3. 兼容旧数据和新数据的同处理逻辑 --- **总结**:Oracle中`CASE WHEN`在查询条件中的核心价值是提供动态逻辑处理能力,但需注意控制复杂度。对于高频、大数据量查询,建议优先考虑标准条件表达式或预计算字段。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值