在ETL项目中经常会碰到这样的一种情况:

目标表中的某列来源于不同的源数据表A,B,C.如果在A中没有有效的数据则从B中取,如果B中没有则从C中取,如果C中也没有则设置为空值。

遇到这样的情况可能,有时候第一个念头就是case when then else end这样的方式,这种方式也可以解决问题,但是写起来还是比较复杂,容易出错,特别是当别人看你写的SQL的时候会头疼。

那么有没有更好的办法呢?

那就是coalesce函数。

COALESCE函数可以替代CASE语句,而且比CASE要方便得多,COALESCE格式:COALESCE (expression_1, expression_2, ...,expression_n)。

第一个非空的表达式是函数的返回值,如果所有的表达式都是空值,最终将返回一个空值。

下面举个项目中实际例子:

问题描述:目标表某列数据来源于HR.MGR_ENTITYCODE, PS.BRAND_CD, PS.ORG,如果HR.MGR_ENTITYCODE没有为空则从 PS.BRAND_CD, PS.ORG取值,如果都为空则返回空值。

SQL如下:

SELECT CI.RESOURCE_ID, COALESCE(HR.MGR_ENTITYCODE, PS.BRAND_CD, PS.ORG) CAL_BRAND_CD,CI.BRAND_CD
FROM
TESTENV.CR__ITEMS AS CRI LEFT OUTER JOIN TESTENV.PR_ITEMS AS PRI ON CI.PO_KEY = PRI.PO_KEY
LEFT OUTER JOIN TESTENV.PURCHASE_SUMMARY AS PS ON PRI.PO_KEY = PS.PO_KEY AND PRI.PO_ITEM_NUM = PS.PO_M_NUM
LEFT OUTER JOIN TESTENV.HR_CLD_CONT AS HR ON CI.RESOURCE_ID = HR.RESOURCE_ID
WITH UR;

DB2中coalesce函数的应用的更多相关文章

  1. SQL Server中COALESCE函数的用法

    在SQL Server中COALESCE函数,会返回其参数中第一个不为NULL的参数,效果如下: SELECT COALESCE(NULL,NULL,N'A',NULL,NULL) 结果: SELEC ...

  2. 关于db2中listagg函数开发中的体验

    一.首先解释一下可能会查询的基础问题: 1.1db2 “with ur”是什么意思: 在DB2中,共有四种隔离级:RS,RR,CS,UR.以下对四种隔离级进行一些描述,同时附上个人做试验的结果.隔离级 ...

  3. Oracel中coalesce函数的用法

    1.coalesce函数的用法 1.1 取出第一个不为空的列的数据.

  4. MYSQL中coalesce函数的用法

    coalesce():返回参数中的第一个非空表达式(从左向右依次类推): 例如: select coalesce(null,4,5); // 返回4 select coalesce(null,null ...

  5. db2中left()函数和right()函数对应oracle中的substr()函数

     DB2 LEFT.RIGHT函数 语法:LEFT(ARG,LENGTH).RIGHT(ARG,LENGTH) LEFT.RIGHT函数返回ARG最左边.右边的LENGTH个字符串,ARG可以是CHA ...

  6. [代码]--db2中left()函数和right()函数对应oracle中的substr()函数

     DB2 LEFT.RIGHT函数 语法:LEFT(ARG,LENGTH).RIGHT(ARG,LENGTH) LEFT.RIGHT函数返回ARG最左边.右边的LENGTH个字符串,ARG可以是CHA ...

  7. DB2中OLAP函数使用示例

      下面的需求是将不仅获取查询的结果集,还要将结果集的SIZE返回.结果集的SIZE是无法通过CURSOR获取的.   通常聚合函数在二种情况下,使用默认分组即没有分组.可以直接使用,比如 selec ...

  8. SqlServer coalesce函数

    SqlServer数据库中coalesce函数用法:在SqlServer2005中有了新的函数,它非常的实用,它就是coalesce函数,此函数可以返回参数中的第一个非空表达式,当你要在N个字段中选取 ...

  9. (转)DB2中的一些函数

    DB2中的一些函数 原文:https://www.cnblogs.com/ShaYeBlog/archive/2012/08/27/2658025.html 最近用DB2,数据库之间的差异还是很大的, ...

随机推荐

  1. 嵌入式Linux学习(二)

    嵌入式系统和通用计算机的主要区别 嵌入式系统是指以应用为中心,以计算机技术为基础,软件硬件可裁剪,适应应用系统对功能.可靠性.成本.体积.功耗严格要求的专用计算机系统. 嵌入式系统主要由嵌入式微处理器 ...

  2. [置顶] javascript-基于对象or面向对象?

    最近完成了javascript的初级学习,在这个学习的视频中,我特别注意了两个词,解释性语言和对象,javascript按照我的理解,应该是种解释性语言,他有关于面向对象的思想的体现,但是,他和vb一 ...

  3. Python学习入门基础教程(learning Python)--5.6 Python读文件操作高级

    前文5.2节和5.4节分别就Python下读文件操作做了基础性讲述和提升性介绍,但是仍有些问题,比如在5.4节里涉及到一个多次读文件的问题,实际上我们还没有完全阐述完毕,下面这个图片的问题在哪呢? 问 ...

  4. Jenkins+PMD构建自动化静态代码检测

    前言:软件缺陷是不可避免的,要尽量减少错误并提高软件质量,主要有两在类技术,即缺陷预防和缺陷检测 缺陷预防包括编写更好的设计规范.实施代码审核制度.运行代码静态分析工具.运行单元测试等 PMD是一种开 ...

  5. JS中转义字符的处理

    //去掉html标签 1 2 3 function removeHtmlTab(tab) {  return tab.replace(/<[^<>]+?>/g,'');//删除 ...

  6. JVM执行引擎的执行过程

    摘自深入分析java web技术内幕

  7. 明天opp¥this xuexi 资料在高中一班

    明天opp¥this xuexi 资料在高中一班

  8. AngularJs 通过 ocLazyLoad 实现动态(懒)加载模块和依赖-转

    http://blog.csdn.net/zhangh8627/article/details/51752872 AngularJs 通过 ocLazyLoad 实现动态(懒)加载模块和依赖 标签:  ...

  9. InnoDB引擎数据存放位置

    InnoDB引擎的mysql数据存放位置 采用InnoDB引擎的数据库创建表后,会在mysql数据存放目录下生成一个和数据库名相同的目录.该目录下包涵一个db.opt文件和该库下所有表同名的frm文件 ...

  10. idea不能加载xml