和Null有关的函数(r3笔记第48天)

关于null相关的函数在日常的工作中还有比较实用的,可能会碰到各种和Null校验相关的情况,大体有以下几种。 case when decode nvl nvl2 lnnvl nullif coalsce -->case when case when算是这个比较通用的方法,可以支持各种复杂的逻辑判断,对于Null的校验也不在话下,可能相对来说程序会略显臃肿。在性能方面还没有做更多的测试,暂时不好评估。

SQL> select case when (1=1) then 2 end from dual;   -->如果1=1满足,就返回2,否则返回null
CASEWHEN(1=1)THEN1END
---------------------
                   2
SQL> select case when (1=2) then 2 end from dual;  -如果1=2成立,就返回2,否则返回null
CASEWHEN(1=2)THEN2END
---------------------

-->nvl

  select nvl('expr1 is  not null','expr1 is  null') from dual;  -->如果expr1不为Null,就输出expr1 is  null
NVL('EXPR1ISNOTNU
-----------------
expr1 is not null
SQL>   select nvl(null,'expr1 is null') from dual;  -->如果expr1为Null,就输出expr1 is null
NVL(NULL,'EXP
-------------
expr1  is null

-->nvl2(expr1,expr2,expr3)

 If  expr1 is not null, then NVL2 returns expr2. If expr1 is null, then NVL2 returns  expr3.
SQL>    select nvl2(null,'expr1 is null return expr3','expr1 is not  null return expr2') from dual;  -->可以看到,expr1为null,就输出了expr3
NVL2(NULL,'EXPR1ISNULLRETURNEX
------------------------------
expr1  is not null return expr2
SQL>    select nvl2('1','expr1 is null return expr3','expr1 is not null  return expr2') from dual;  -->可以看到expr1不为Null,就输出expr2
NVL2('1','EXPR1ISNULLRETUR
--------------------------
expr1  is null return expr3

-->lnnvl 这个问题可以创建一个表来测试一下,test_null,返回的结果都是相反的。

   create table test_null (id number);
  insert into test_null values(1);
   insert into test_null values(2);
  insert into test_null values(3);
SQL> select id from test_null where lnnvl(id<1);   --如果id<1,就输出id>=1
        ID
----------
         1
          2
         3
SQL> select id from test_null where lnnvl(id>=1);   --如果id>=1,就输出id>=1
no rows selected
SQL> select id from test_null where lnnvl(id=1);
         ID
----------
         2
          3

-->nullif 这个函数类似如下的case when形式

CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END
SQL> select nullif(1,1)from dual;
NULLIF(1,1)
-----------
SQL> select nullif(1,2) from  dual;
NULLIF(1,2)
-----------
          1
SQL>  select  nullif(2,1)from dual;
NULLIF(2,1)
-----------
          2
SQL> select nullif(1,null)from  dual;
NULLIF(1,NULL)
--------------
             1
SQL> select  nullif(null,1)from dual;  -可以看到如果expr1是Null,会报出ora-00932的错误,如果expr2是null,还是满足条件有输出的。
select  nullif(null,1)from dual
              *
ERROR at line 1:
ORA-00932:  inconsistent datatypes: expected - got CHAR
decode
SQL> select decode(1,1,3,4)from  dual;
DECODE(1,1,3,4)
---------------
              3
SQL> select decode(1,2,3,4)from  dual;
DECODE(1,2,3,4)
---------------
              4

-->COALSCE 这个函数类似如下case when的形式

CASE WHEN expr1  IS NOT NULL THEN expr1 ELSE expr2  END

可以创建一个临时的表来测试一下。可以看到在id1,id2,id3为空的时候输出。

create table test_coalesce  (id1 number,id2 number,id3 number);
insert into test_coalesce  values(1,null,null);
insert into test_coalesce values(2,1,null);
insert  into test_coalesce values(null,null,1);
SQL> select id1,id2,id3 from test_coalesce;
       ID1         ID2        ID3
---------- ---------- ----------
         1
          2          1
                               1
SQL> select  coalesce(id1,id2,id3) from  test_coalesce;
COALESCE(ID1,ID2,ID3)
---------------------
                     1
                    2
                    1 

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-11-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏GreenLeaves

SQL学习之HAVING过滤分组

1、SQL除了能用Group By分组数据之外,SQL还允许过滤分组,规定包括那些分组,排除那些分组。例如,你可能想要列出至少有两个订单的所有顾客。为此,必须基...

2375
来自专栏向治洪

百度地图之收索视野内的建筑物

根据用户移动地图的位置,显示在视野范围内的建筑物,简单的思路是,添加地图监听,当地图移动结束之后,计算出当前屏幕四个角的GeoPoint,根据这4个点,通过my...

1769
来自专栏lgp20151222

mysql explain用法和结果的含义

explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。

1611
来自专栏数据库

Java SQL语句优化经验

. (1) 选择最有效率的表名顺序(只在基于规则的seo/' target='_blank'>优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FR...

2619
来自专栏Ryan Miao

group by 和聚合函数

group by 的基本用法                                                                  ...

30511
来自专栏me的随笔

T-SQL基础(二)之关联查询

表运算符的作用是把为其提供的表作为输入,经过逻辑查询处理,返回一个表结果。SQL Server支持四个表运算符:JOIN、APPLY、PIVOT、UNPIVOT...

994
来自专栏猿人谷

Oracle SQL性能优化

(1)      选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最...

3377
来自专栏文渊之博

初识SQL Server2017 图数据库(一)

背景:   图数据库对于表现和遍历复杂的实体之间关系是很有效果的。而这些在传统的关系型数据库中尤其是对于报表而言很难实现。如果把传统关系型数据库比做火车的话,那...

2888
来自专栏乐沙弥的世界

SQL server 2005 PIVOT运算符的使用

        PIVOT,UNPIVOT运算符是SQL server 2005支持的新功能之一,主要用来实现行到列的转换。本文主要介绍PIVOT运算符的操作,...

702
来自专栏lgp20151222

索引之单列索引和组合索引

若有组合索引(a,b,c),那么根据最左前缀,数据库成立了三个索引(a)(a,b)(a,b,c),

1193

扫码关注云+社区

领取腾讯云代金券