union联合查询和case when的用法

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。


请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。


注释:默认地,UNION 操作符选取不同的值,即UNION是去了重的。如果允许重复的值,请使用 UNION ALL。

UNION 指令的目的是将两个 SQL 语句的结果合并起来。从这个角度来看, UNION 跟 JOIN 有些许类似,因为这两个指令都可以由多个表格中撷取资料。union只是将两个结果联结起来一起显示,并不是联结两个表。


案例:现在将两个结果联结起来一起显示,因为两个表都有时间,我要先显示一个A表,如果A表时间是NULL,就显示B表的时间。

SELECT 列名 FROM 表 WHERE 

union 

SELECT 列名 FROM 表 WHERE


Case具有两种格式。简单Case函数和Case搜索函数。

--简单Case函数
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
--Case搜索函数
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END

这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。 
还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。 
--比如说,下面这段SQL,你永远无法得到“第二类”这个结果
CASE WHEN col_1 IN ( 'a', 'b') THEN '第一类'
WHEN col_1 IN ('a')       THEN '第二类'
ELSE'其他' END




如果你是湖南的 欢迎加入 湖南人在深圳-Java群:557651502

<think>嗯,用户问的是Oracle查询条件中使用CASE WHEN的情况。首先,我得回忆一下CASE WHEN在SQL中的常见用法,尤其是在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`在查询条件中的核心价值是提供动态逻辑处理能力,但需注意控制复杂度。对于高频、大数据量查询,建议优先考虑标准条件表达式或预计算字段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值