CASE WHEN 语句在Oracle和Sybase库中的不同

本文通过具体示例对比了Oracle与Sybase中CASE WHEN语句的不同表现,指出在Oracle中应采用特定写法以避免NULL值判断错误。

今天提交程序之后,反应有BUG,经仔细查询,发现一个之前并没注意到的问题,那就是case when 语句在Oracle中执行的BUG,用脚本来说明;

Oracle

--建表
CREATE TABLE TABLE_01 
(CODE INT NOT NULL,
NAME VARCHAR2(20) NULL);
--插入数值,之所以分别插入null和''是因为在Sybase中''和null是两个不同的值
INSERT INTO TABLE_01 VALUES (1,'');
INSERT INTO TABLE_01 VALUES (2,NULL);
SELECT * FROM TABLE_01;
查询结果为:

使用不同的两种case when 语句查询:

SELECT CASE NAME WHEN '' THEN '1' WHEN NULL THEN '2' ELSE '3' END FROM TABLE_01 WHERE CODE=1;
SELECT CASE WHEN NAME='' THEN '1' WHEN NAME IS NULL THEN '2' ELSE '3' END FROM TABLE_01 WHERE CODE=1;

前者结果为3  后者结果为 2。也就是说case when 这两种方法Oracle虽然都能执行且不报错,但结果却完全不同,第一种写法无法比出null值。

SELECT CASE NAME WHEN '' THEN '1' WHEN NULL THEN '2' ELSE '3' END FROM TABLE_01 WHERE CODE=1;
SELECT CASE WHEN NAME='' THEN '1' WHEN NAME IS NULL THEN '2' ELSE '3' END FROM TABLE_01 WHERE CODE=1;

Sybase

--建表
CREATE TABLE TABLE_01 
(CODE INT NOT NULL,
NAME VARCHAR(20) NULL) 
--插入数值,之所以分别插入null和''是因为在Sybase中''和null是两个不同的值
INSERT INTO TABLE_01 VALUES (1,'') 
INSERT INTO TABLE_01 VALUES (2,NULL) 
SELECT * FROM TABLE_01 
查询结果为:,由此可见sybase中‘’和null不是一个值。

使用两种case when 查询结果:



结论:case when的两种写法,在sybase中随便使用,而在Oracle中则只能用case when cloumn=? then ? when column=? then ? else ? end 这种写法。

Oracle数据中的 `CASE WHEN` 语句是一种强大的条件表达式,用于在查询中实现逻辑判断结果选择。它类似于编程语言中的 `if-then-else` 结构,允许根据不同的条件返回不同的值。 ### 基本语法结构 `CASE` 表达式有两种形式:**简单 `CASE`** **搜索 `CASE`**。 #### 简单 CASE 表达式 该形式适用于将某个表达式与多个可能的值进行比较: ```sql CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 ... ELSE default_result END ``` 例如,根据员工的部门编号显示对应的部门名称: ```sql SELECT employee_id, CASE department_id WHEN 10 THEN '人力资源部' WHEN 20 THEN '财务部' WHEN 30 THEN '技术部' ELSE '其他部门' END AS department_name FROM employees; ``` #### 搜索 CASE 表达式 该形式更为灵活,适用于复杂的条件判断: ```sql CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... ELSE default_result END ``` 例如,根据员工工资水平分类: ```sql SELECT employee_id, salary, CASE WHEN salary < 3000 THEN '低薪' WHEN salary BETWEEN 3000 AND 7000 THEN '中等薪资' ELSE '高薪' END AS salary_level FROM employees; ``` ### 使用场景与注意事项 - **数据转换**:可以用于将某些字段值映射为更具可读性的信息,如性别代码转为“男”、“女”。 - **业务逻辑嵌入**:可在查询中直接实现部分业务逻辑判断,避免将原始数据导出后处理。 - **聚合分析**:结合 `GROUP BY` `SUM`, `COUNT` 等函数使用,支持多维度数据分析。 - **性能影响**:虽然 `CASE WHEN` 提供了灵活性,但过于复杂的条件判断可能影响查询性能,应谨慎使用。 此外,`CASE WHEN` 可以嵌套使用,实现更复杂的逻辑判断,但嵌套层次过多时建议考虑通过视图、函数等方式拆分逻辑以提高可维护性。 --- ### 示例:结合 NULL 处理的 CASE WHEN 以下示例展示了如何处理 `NULL` 值的情况: ```sql SELECT employee_id, CASE WHEN manager_id IS NULL THEN '无上级主管' ELSE '有上级主管' END AS manager_status FROM employees; ``` --- ### 总结 `CASE WHEN` 是 Oracle SQL 中非常实用的工具,能够提升查询的灵活性表达能力。合理使用 `CASE WHEN` 不仅能简化应用程序逻辑,还能增强数据端的数据处理能力。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值