欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入 数据库应用软件很多时候将多重的、相关的实体信息保存在同一个表格中。例如,购买的零件和本地生产的零件都是零件,经理和工人都是员工,尽管多重的实体类型在数据存储上略有不同,但是它们有太多的

欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入

数据库应用软件很多时候将多重的、相关的实体信息保存在同一个表格中。例如,购买的零件和本地生产的零件都是零件,经理和工人都是员工,尽管多重的实体类型在数据存储上略有不同,但是它们有太多的相同之处,因此通常使用一个表格而不是两个。

处理这样的表格通常意味着对每一行进行条件测试来检查哪个实体类型正在被处理,然后返回每种类型的不同结果集。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两列的信息,对于购买的零件则是空值。

列表A:

SQL> desc parts

Name Null? Type

PART_ID NOT NULL NUMBER(6)

PART_TYPE NOT NULL CHAR(1)

(other columns)

PURCHASE_COST NUMBER(8,2)

MATERIAL_COST NUMBER(8,2)

MATERIAL_QTY NUMBER(6)

LAST_UPDATED TIMESTAMP(6)

UPDATED_BY VARCHAR2(30)

您可以使用一个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是自动进行文档记录的,这便于理解和解读正在发生的事情。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

coalesce函数用法php,如何使用Oracle中的 COALESCE 函数相关推荐

  1. 标准C语言各种时间函数用法,使用c语言标准库中的时间函数

    #include #include int main(void){ time_t start, finish, now; struct tm *ptr; char *c, buf1[80]; doub ...

  2. oracle分类函数总结,oracle中分组排序函数用法

    项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...

  3. Oracle中ROW_NUMBER() OVER()函数用法

    Oracle中ROW_NUMBER() OVER()函数用法 1. 说明:ROW_NUMBER() OVER() 函数的作用:分组排序 2. 原理: row_number() over() 函数,ov ...

  4. oracle求和分组排序,oracle中分组排序函数用法 - 转

    项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...

  5. oracle怎么声明nvl函数,[转载]Oracle中的NVL函数

    Oracle中函数以前介绍的字符串处理,日期函数,数学函数,以及转换函数等等,还有一类函数是通用函数.主要有:NVL,NVL2,NULLIF,COALESCE,这几个函数用在各个类型上都可以. 下面简 ...

  6. oracle substr(table),oracle中的substr()函数

    SUBSTR(cExpression,nStartPosition [,nCharactersReturned]) 其中,cExpression指定要从其中返回字符串的字符表达式或备注字段: nSta ...

  7. oracle取第一位,Oracle中的substr()函数和INSTR()函数

    1)substr函数格式   (俗称:字符截取函数) 格式1: substr(string string,int a,int b); 格式2:substr(string string,int a) ; ...

  8. oracle中转换函数,Oracle中的转换函数

    Oracle中的转换函数有三个,分别为to_char(),to_date(),to_number() 1.to_char()的用法 格式化当前的日期时间 select sysdate,to_char( ...

  9. oracle中的trim函数使用介绍

    Oracle TRIM函数是很常见的函数,下面对Oracle TRIM函数的语法作了详尽的阐述说明,希望可以让您对Oracle TRIM函数有更深的认识. 如果提到Oracle TRIM函数,最简单的 ...

最新文章

  1. Anconda PyCharm TensorFlow
  2. Activity栈管理(三):Intent的Flag与taskAffinity
  3. 【必须收藏】那些酷炫的深度学习网络图怎么画出来的?
  4. java实现接收字符串对象并在后台代码中转成list对象
  5. html5 拖拽上传文件时,屏蔽浏览器默认打开文件
  6. mysql 读写分离
  7. hadoop项目实战--ETL--(三)实现mysql表到HIVE表的全量导入与增量导入
  8. caffe里的blocking_queue.hpp与.cpp干了点什么呢???
  9. 又一知名教授在美被捕!饶毅发文声援,中方也回应了!
  10. c#明华rf读卡器_RF通用开发包 明华RF读卡器 demo for c#(RF reader demo for c#) - 下载 - 搜珍网...
  11. 工业和能源1994-2019年省级面板数据
  12. SONY图像传感器列表
  13. coreldraw x7 分布_CDR X7新增功能有哪些,CDR X7新功能介绍
  14. 最新Mac Pro详解
  15. Selenium版本与浏览器版本
  16. Springboot学生选课系统的设计与实现毕业设计源码
  17. 笔记本配置连接打印机
  18. html中,将字符串对象数组转成对象数组
  19. C语言与离散数学的结合--逻辑推理
  20. 安卓内存监控apk,Android程序员如何有效提升学习效率?深夜思考

热门文章

  1. 关于两个超级计算机的电影,又一部十级烧脑悬疑大片,两个连接的神秘世界,无路可走的空间...
  2. 摄像头“读脸”的另一种打开方式
  3. mockito 总结
  4. 使用python删除一个文件或文件夹几种办法
  5. 2022年24和27英寸iMac更新计划
  6. 如何在Windows 7、8或10中设置共享网络打印机
  7. 智能指针shared_ptr之引用计数
  8. linux 下操作乱码文件,文件夹
  9. 有点肉麻的英语情话 用英语打动芳心
  10. Elasticsearch 同义词(dynamic-synonym)远程数据库加载