Oracle Case

1.CASE WHEN表达式有两种形式

--简单Case函数

CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END

--Case搜索函数

CASE
WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
2. CASE WHEN 在语句中不同位置的用法

2.1 SELECT CASE WHEN 用法


SELECT grade, COUNT (CASE WHEN sex = 1 THEN 1 /*sex 1为男生,2位女生*/
ELSE NULL
END) 男生数,
COUNT (CASE WHEN sex = 2 THEN 1
ELSE NULL
END) 女生数
FROM students GROUP BY grade;



2.3 WHERE CASE WHEN 用法


SELECT T2.*, T1.*
FROM T1, T2
WHERE (CASE WHEN T2.COMPARE_TYPE = 'A' AND
T1.SOME_TYPE LIKE 'NOTHING%'
THEN 1
WHEN T2.COMPARE_TYPE != 'A' AND
T1.SOME_TYPE NOT LIKE 'NOTHING%'
THEN 1
ELSE 0
END) = 1



2.4 GROUP BY CASE WHEN 用法


SELECT
CASE WHEN salary <= 500 THEN '1'
WHEN salary > 500 AND salary <= 600 THEN '2'
WHEN salary > 600 AND salary <= 800 THEN '3'
WHEN salary > 800 AND salary <= 1000 THEN '4'
ELSE NULL END salary_class, -- 别名命名
COUNT(*)
FROM Table_A
GROUP BY
CASE WHEN salary <= 500 THEN '1'
WHEN salary > 500 AND salary <= 600 THEN '2'
WHEN salary > 600 AND salary <= 800 THEN '3'
WHEN salary > 800 AND salary <= 1000 THEN '4'
ELSE NULL END;

3.关于IF-THEN-ELSE的其他实现

3.1 DECODE() 函数

select decode(sex, 'M', 'Male', 'F', 'Female', 'Unknown')
from employees;
貌似只有Oracle提供该函数,而且不支持ANSI SQL,语法上也没CASE WHEN清晰,个人不推荐使用。


3.2 在WHERE中特殊实现

SELECT T2.*, T1.*
FROM T1, T2
WHERE (T2.COMPARE_TYPE = 'A' AND T1.SOME_TYPE LIKE 'NOTHING%')
OR
(T2.COMPARE_TYPE != 'A' AND T1.SOME_TYPE NOT LIKE 'NOTHING%')
这种方法也是在特殊情况下使用,要多注意逻辑,不要弄错。
### Oracle 数据库中的 CASE 语句 在 Oracle 数据库中,`CASE` 表达式用于执行条件逻辑操作。它类似于编程语言中的 `if-then-else` 结构,允许基于特定条件返回不同值。以下是关于 `CASE` 的详细介绍及其用法。 #### 简单 CASE 表达式 简单 `CASE` 表达式的语法如下: ```sql CASE input_expression WHEN when_expression THEN result_expression_1 WHEN when_expression THEN result_expression_2 ... ELSE else_result_expression END ``` 此表达式会比较 `input_expression` 和每个 `when_expression`,如果匹配,则返回对应的 `result_expression` 值[^4]。 #### 搜索 CASE 表达式 搜索 `CASE` 表达式的灵活性更高,其语法结构为: ```sql CASE WHEN condition_1 THEN result_expression_1 WHEN condition_2 THEN result_expression_2 ... ELSE else_result_expression END ``` 在此形式下,可以指定任意布尔条件来决定返回哪个结果[^4]。 #### 使用示例 下面是一些实际应用的例子展示如何利用 `CASE` 来处理数据查询需求。 ##### 示例 1: 将数值转换成等级描述 假设有一个学生分数表 (`student_scores`),其中包含字段 `score`,我们希望将其映射到相应的成绩等级。 ```sql SELECT student_id, score, CASE WHEN score >= 90 THEN 'A' WHEN score BETWEEN 80 AND 89 THEN 'B' WHEN score BETWEEN 70 AND 79 THEN 'C' WHEN score < 70 THEN 'D' ELSE 'Unknown' END AS grade_level FROM student_scores; ``` 上述 SQL 查询通过 `CASE` 实现了对学生得分的分类,并赋予相应字母表示的成绩等级[^5]。 ##### 示例 2: 计算折扣后的价格 考虑一张商品信息表 (`products`) 中有原价(`original_price`) 列以及库存状态(`stock_status`) 列。我们可以依据存货情况调整最终售价。 ```sql SELECT product_name, original_price, stock_status, CASE WHEN stock_status = 'Low' THEN ROUND(original_price * 0.9, 2) WHEN stock_status = 'Medium' THEN ROUND(original_price * 0.95, 2) ELSE original_price END AS discounted_price FROM products; ``` 这里展示了根据不同库存水平计算打折后金额的方法[^6]。 #### 注意事项 虽然 `CASE` 提供强大的控制能力,但在某些情况下可能不如其他函数简洁高效。例如,在简单的真/假判断上可以直接采用解码器(Decode) 函数替代复杂写法;然而对于多分支或多层嵌套情形而言,`CASE` 显得更加直观易读[^7]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值