如何使用Oracle的COALESCE函数

如题所述

数据库应用软件很多时候将多重的、相关的实体信息保存在同一个表格中。例如,购买的零件和本地生产的零件都是零件,经理和工人都是员工,尽管多重的实体类型在数据存储上略有不同,但是它们有太多的相同之处,因此通常使用一个表格而不是两个。
处理这样的表格通常意味着对每一行进行条件测试来检查哪个实体类型正在被处理,然后返回每种类型的不同结果集。CASE语句可以用来完成这一工作。
从Oracle 9i版开始,COALESCE函数在很多情况下就成为替代CASE语句的一条捷径,COALESCE的格式如下:
COALESCE (expression_1, expression_2, ...,expression_n)
列表中第一个非空的表达式是函数的返回值,如果所有的表达式都是空值,最终将返回一个空值。
使用COALESCE的秘密在于大部分包含空值的表达式最终将返回空值(连接操作符||是一个值得注意的例外)。例如,空值加任何值都是空值,空值乘任何值也都是空值,依此类推。
这样您就可以构建一系列表达式,每个表达式的结果是空值或非空,这就像一个CASE语句,表达式按照顺序进行测试,第一个满足条件的值就确定了结果。
列表A展示了名为PARTS的表格的一部分,该表格存储了购买的零件数据和生产的零件数据,如果是购买的零件,那么part_type列的值为‘P’,如果是本地生产或组装的则是‘B’;此外,对于购买的零件,purchase_cost 列会显示购买成本,而本地生产的零件则是空值;而且,本地生产的零件还有material_qty和material_cost两列的信息,对于购买的零件则是空值。
您可以使用一个CASE语句来测试part_type列的值并返回either purchase_cost和material_qty列与material_cost列的乘积;不过COALESCE可以用一行语句解决这个问题:
COALESCE(purchase_cost, material_qty * material_cost)
如果数据行中存储的是一个购买的零件,那么purchase_cost就不是空值,将返回purchase_cost的值;然而,对于本地生产的零件,purchase_cost是空值,COALESCE会忽略它,然后将material_qty和material_cost相乘,并将乘积作为结果返回。
SELECT part_id "Part", part_type "Type",
COALESCE(purchase_cost, material_qty * material_cost) "Cost"
FROM parts;
您可以对任何数量的表达式重复使用这个模式,COALESCE是一个非常便捷的方法对统一表格中的多重实体求值。
最后,还要说一点CASE语句的优点,就是CASE是自动进行文档记录的,这便于理解和解读正在发生的事情。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-12-16
Oracle COALESCE函数语法为COALESCE(表达式1,表达式2,...,表达式n),n>=2,此表达式的功能为返回第一个不为空的表达式,如果都为空则返回空值。
注意:所有表达式必须为同一类型或者能转换成同一类型。
示例一:在emp表中给comm列为空的人员设为200
SQL> select a.empno,a.ename,comm,coalesce(comm,200)new_comm from emp a;

EMPNO ENAME COMM NEW_COMM
---------- -------------------- ---------- ----------
7369 SMITH 200
7499 ALLEN 300 300
7521 WARD 500 500
7566 JONES 200
7654 MARTIN 1400 1400
7698 BLAKE 200
7782 CLARK 200
7788 SCOTT 200
7839 KING 200
7844 TURNER 0 0
7876 ADAMS 200

EMPNO ENAME COMM NEW_COMM
---------- -------------------- ---------- ----------
7900 JAMES 200
7902 FORD 200
7934 MILLER 200
8888 xiangyc 888.88 888.88
已选择15行。

示例2:模拟返回第一个不为空的值
SQL> select coalesce(null,3+5,4+6) value from dual;
VALUE
----------
8

示例3:模拟数据类型不一致的情况
SQL> select COALESCE (null,333,444,'555') from dual;
select COALESCE (null,333,444,'555') from dual
第 1 行出现错误:
ORA-00932: 数据类型不一致: 应为 NUMBER, 但却获得 CHAR
第2个回答  2016-11-17
数据库应用软件很多时候将多重的、相关的实体信息保存在同一个表格中。例如,购买的零件和本地生产的零件都是零件,经理和工人都是员工,尽管多重的实体类型在数据存储上略有不同,但是它们有太多的相同之处,因此通常使用一个表格而不是两个。
处理这样的表格通常意味着对每一行进行条件测试来检查哪个实体类型正在被处理,然后返回每种类型的不同结果集。CASE语句可以用来完成这一工作。
从Oracle 9i版开始,COALESCE函数在很多情况下就成为替代CASE语句的一条捷径,COALESCE的格式如下:
COALESCE (expression_1, expression_2, ...,expression_n)
列表中第一个非空的表达式是函数的返回值,如果所有的表达式都是空值,最终将返回一个空值。
使用COALESCE的秘密在于大部分包含空值的表达式最终将返回空值(连接操作符||是一个值得注意的例外)。例如,空值加任何值都是空值,空值乘任何值也都是空值,依此类推。
这样您就可以构建一系列表达式,每个表达式的结果是空值或非空,这就像一个CASE语句,表达式按照顺序进行测试,第一个满足条件的值就确定了结果。
列表A展示了名为PARTS的表格的一部分,该表格存储了购买的零件数据和生产的零件数据,如果是购买的零件,那么part_type列的值为‘P’,如果是本地生产或组装的则是‘B’;此外,对于购买的零件,purchase_cost 列会显示购买成本,而本地生产的零件则是空值;而且,本地生产的零件还有material_qty和material_cost两列的信息,对于购买的零件则是空值。
您可以使用一个CASE语句来测试part_type列的值并返回either purchase_cost和material_qty列与material_cost列的乘积;不过COALESCE可以用一行语句解决这个问题:
COALESCE(purchase_cost, material_qty * material_cost)
如果数据行中存储的是一个购买的零件,那么purchase_cost就不是空值,将返回purchase_cost的值;然而,对于本地生产的零件,purchase_cost是空值,COALESCE会忽略它,然后将material_qty和material_cost相乘,并将乘积作为结果返回。
SELECT part_id "Part", part_type "Type",
COALESCE(purchase_cost, material_qty * material_cost) "Cost"
FROM parts;
您可以对任何数量的表达式重复使用这个模式,COALESCE是一个非常便捷的方法对统一表格中的多重实体求值。
最后,还要说一点CASE语句的优点,就是CASE是自动进行文档记录的,这便于理解和解读正在发生的事情。
第3个回答  2017-04-27
COALESCE(par1,par2,par3,....)
返回第一个不为空空的参数,如果所有的参数都为null则返回null
相似回答