以上截图来自官方文档:
Oracle® Database SQL Language Reference
11g Release 2 (11.2)
Case表达式处理的是逻辑判断。基于行数据的逻辑判断,不需要去调用存储过程。
在简单case表达式中,WHEN comparison_expr THEN return_expr是成对出现的,oracle就是从左往右搜索判断找到第一个comparison_expr和expr相等的,然后返回return_expr。如果没有WHEN ... THEN中的comparison_expr和expr相等,就返回else_expr。否则返回null.
在搜索case表达式中,oracle从左到右搜索判断直到找到第1个为true的表达式。然后返回return_expr。如果没有condition为true,返回ELSE指定的值。否则,返回null.
oracle使用短路径搜索,只有在前1个不相等(简单case表达式)或者条件判断为false(搜索case表达式),才会进行下一个的判断匹配。
在简单case表达式中,expr和comparison_expr必须要么是相同的数据类型(CHAR, VARCHAR2, NCHAR, or NVARCHAR2, NUMBER, BINARY_FLOAT, or BINARY_DOUBLE),或者是都是数字数据类型。如果表达式都是数字类型,oracle把所有的隐式转换到其中最高优先级的类型,返回值也是这种类型。
对于简单case表达式和搜索case表达式,所有的return_exprs必须要么是相同的数据类型(CHAR, VARCHAR2, NCHAR, or NVARCHAR2, NUMBER, BINARY_FLOAT, or BINARY_DOUBLE),或者是都是数字数据类型。如果所有返回表达式都是数字类型,oracle把所有的隐式转换到其中最高优先级的类型,返回值也是这种类型。
CASE表达式中的最大参数个数是65535。WHEN ... THEN算2个参数,ELSE ...算1个参数,case ... 算一个参数。
简单case表达式(只能判断是否相等,在需求简单时候很简洁,当然你也可以数值相减然后用sign函数间接判断数值大小)
SELECT cust_last_name,
CASE credit_limit WHEN 100 THEN 'Low'
WHEN 5000 THEN 'High'
ELSE 'Medium' END AS credit
FROM customers
ORDER BY cust_last_name, credit;
CUST_LAST_NAME CREDIT
-------------------- ------
Adjani Medium
Adjani Medium
Alexander Medium
Alexander Medium
Altman High
Altman Medium
. . .
搜索case表达式(判断when后面的表达式是否为真,功能更加灵活强大)
SELECT AVG(CASE WHEN e.salary > 2000 THEN e.salary
ELSE 2000 END) "Average Salary" FROM employees e;
Average Salary
--------------
6461.68224