序言
背景说明
Oracle 数据库提供了丰富的内置函数,涵盖数值处理、字符串操作、日期和时间处理、逻辑判断、集合处理、数据分析、数据类型转换等多个方面。上进入个章节学习了很多的Oracle内置函数,今天再来学习下也是比较常常使用的函数——逻辑判断。下面就随着我一起来学习下这个内置函数吧,有解释不到之处,还望批评指正。
逻辑判断和条件判断
在Oracle数据库中,逻辑判断和条件判断是两个密切相关但又不完全相同的概念。本篇应该说是为了凑够一个篇幅来讲解下这两个方向的函数。
【逻辑判断】
逻辑判断主要关注的是根据逻辑运算符(如AND、OR、NOT)对条件表达式的结果进行逻辑运算,从而得出最终的布尔值(true或false)。
【条件判断】
条件判断则更侧重于根据给定的条件或表达式来判断某个操作是否应该执行,或者应该执行哪个分支的操作。
示例环境
本篇示例是基于Oracle DB 19c EE (19.17.0.0.0)
版本操作,所操作的环境依旧是oracle提供的在线测试环境。如果有不同之处,请指出。
测试数据
同上次一样,还是使用上次的数据,在employees表中插入4条测试数据。
逻辑判断
1 AND
如果所有输入条件都为真,则返回真(true)。否则,返回假(false)。
查询薪资在5000美元以上且部门编号大于20的员工信息。
代码语言:javascript复制SELECT * FROM employees WHERE SALARY > 50000 AND DEPARTMENT_ID > 20;
2 OR
如果至少有一个输入条件为真,则返回真(true)。如果所有输入条件都为假,则返回假(false)。
查询薪资在5000美元以上或者部门编号在20以上的员工。
代码语言:javascript复制SELECT * FROM employees WHERE SALARY > 50000 OR DEPARTMENT_ID > 20;
3 NOT
对单个输入条件取反。如果输入条件为真,则返回假(false);如果输入条件为假,则返回真(true)。
查询部门编号不在 10和20 中的员工。
代码语言:javascript复制SELECT * FROM employees WHERE DEPARTMENT_ID NOT IN (10, 20);
通常NOT与IN、IS搭配使用,效果更佳。例如 NOT IN、IS NOT NULL、NOT EXISTS,其中 NOT IN、NOT EXISTS 用于排除数据记录,应用在WHERE子句中较多;NOT EXISTS 也应用于创建数据库、数据表中使用较多。
条件判断
1 CASE表达式
CASE表达式是一个比较常用的表达式工具,它允许在SQL语句中使用逻辑结构为 如果 ... 那么... 如果 ... 那么... 最后 的SQL语句。
默认情况下,CASE返回第一个WHEN THEN后的结果数据;如果多个情况下,从做到右依次检查是否满足条件,遇到满足条件则结束处理。
简单方式
CASE colName WHEN ... THEN ... ELSE defaultValue END
代码语言:javascript复制SELECT
EMPLOYEE_ID,FIRST_NAME, LAST_NAME,
CASE SALARY
WHEN 10000 THEN 'Low-1'
WHEN 20000 THEN 'Low-2'
WHEN 30000 THEN 'Low-3'
WHEN 40000 THEN 'High-1'
WHEN 50000 THEN 'High-2'
WHEN 60000 THEN 'High-3'
ELSE 'OTHER' END AS SALARY_LEVEL
FROM employees
ORDER BY DEPARTMENT_ID;
进阶方式
如果是更好的使用在范围上,则可以写成如下方式,这种可以使用计算的方式来处理或写更多的表达式。
CASE WHEN 条件 THEN ... ELSE defaultValue END
代码语言:javascript复制SELECT
EMPLOYEE_ID,FIRST_NAME, LAST_NAME,
CASE
WHEN SALARY <= 10000 THEN 'Low-1'
WHEN SALARY <= 20000 THEN 'Low-2'
WHEN SALARY <= 30000 THEN 'Low-3'
WHEN SALARY <= 40000 THEN 'High-1'
WHEN SALARY <= 50000 THEN 'High-2'
WHEN SALARY <= 60000 THEN 'High-3'
ELSE 'OTHER' END AS SALARY_LEVEL
FROM employees
ORDER BY DEPARTMENT_ID;
其他应用
薪资在[0, 50000]的员工平均默认为 30000,薪资在(50000, 100000]的为真实薪资,然后求员工的平均薪资。
代码语言:javascript复制SELECT
AVG(CASE
WHEN SALARY >= 0 AND SALARY <= 50000 THEN 30000
WHEN SALARY > 50000 AND SALARY <= 100000 THEN SALARY
ELSE 0 END
) AS SALARY_AVG
FROM employees
ORDER BY DEPARTMENT_ID;
DECODE 函数
在oracle中不得不提这个函数,DECODE函数是Oracle特有的,提供了一种在SQL查询中执行简单条件逻辑的方法。不过个人认为,与CASE表达式相比,DECODE的功能简单有限,而且语法较长,特别是对于复杂的条件逻辑不友好,一般也很少使用。这个用于个人感觉是简单方式的case表达式方式。
【语法格式】
DECODE将expr与每个搜索值一一比较。如果expr等于一个搜索,则Oracle数据库返回相应的结果。如果没有找到匹配项,则Oracle返回default。如果省略default,则Oracle返回null。
DECODE(expression, search1, result1, [search2, result2, ...], default)
expression
是要与每个searchN
进行比较的表达式。searchN
是与expression
进行比较的值。resultN
是当expression = searchN
时返回的结果。default
是当没有任何searchN
匹配expression
时返回的值(可选)。
SELECT EMPLOYEE_ID,FIRST_NAME, LAST_NAME, SALARY,
DECODE(SALARY,
100000, 'High-1',
90000, 'High-2',
80000, 'High-3',
70000, 'Middle-1',
60000, 'Middle-2',
50000, 'Middle-3',
30000, 'Low-1',
20000, 'Low-2',
'Low-3') AS SALARY_LEVEL
FROM employees;
总结
本篇简单介绍了下oracle中的一些逻辑判断关键字和条件判断语句以及用法,勤能补拙,希望帮助自己加深记忆的同时也能帮助你。
[引用]
- case表达式:https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/CASE-Expressions.html#GUID-CA29B333-572B-4E1D-BA64-851FABDBAE96
- decode函数:https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/DECODE.html#GUID-39341D91-3442-4730-BD34-D3CF5D4701CE