zoukankan      html  css  js  c++  java
  • oracle-null和默认值

    Oracle的默认值处理要当心,如果应用中使用的是ORM工具,则必须要考虑对于字段为Null的处理,必要时在ORM工具中将Null转换为default或插入时去掉值为Null的字段。
      可以将下面的系统属性作为默认值:
      SYSDATE:系统时间
      SYS_CONTEXT:系统上下文
      USER:当前数据库用户
      USERENV:用户环境变量,可以获取一些IP地址、协议、终端的信息
      需要注意,默认值不能使用LEVEL、PRIOR、ROWNUM,会报ORA-00976错误。
      应用中使用默认值的常见场景是主键或自增列。正如我们所知,Oracle并未提供自增类型,这就需要我们结合默认值进行二次开发,通过默认值实现系统应用的透明。这里结合笔者的经验,提供两种方案:
      触发器+序列
      因为Oracle不支持在default中使用序列,因此我们只能使用触发器来实现。

    如果你工作中用到了Oracle,你必须要留意NULL和空值的处理与SQL Server上的不同.现在让我们看些例子。

    建立这张数据库表并插入记录

        CREATE TABLE TestNull(Col2 VARCHAR(100));
        INSERT INTO TestNull VALUES(NULL);
        INSERT INTO TestNull VALUES('Bla');
        INSERT INTO TestNull VALUES('');
        INSERT INTO TestNull VALUES(' ');

    如你所见我们插入了4条记录,一条记录是null,一条记录是空值,一条记录是空格,一条记录是"Bla".

    让我们执行下面的查询语句:

        SELECT Col2,
          NVL(Col2,'EmptyOrNull') a,
          COALESCE(Col2,'EmptyOrNull') b,
          ASCII(col2) c
        FROM TestNull;
        
    看看发生了什么,Oracle把空值转变成了 NULL。

    Coalesce函数的差别

    要知道coalesce 函数工作原理不一样. Oracle没有isnull函数但有nvl函数来取代。

    运行下面2句sql。

    SELECT NVL('','No') AS a FROM dual;
    SELECT COALESCE('','No') AS a FROM dual;

    在这2种情况下你得到“No”返回值, 如你所见空值被当做null处理.

    知道了Oralce和SQL Server的这些差别,如果你认为他们工作原理相同你会得到些奇怪的查询结果。



    今天突然才发现,Oracle中的“不等于操作符”是忽略Null的。

    比如,查询comm不等于的300的记录,我会理所当然地使用where comm != 300

    预想会返回包含Null的不等于300的记录(意识里认为Null也是“不等于30”的其中一种情况)。

    而实际上,它只返回不为Null且不等于300的记录,见如下测试。
    事实上,并不仅仅“不等于号”与Null的关系是如此的,其他操作符也类似,只不过“不等于号”使用场景的特殊性让我们容易发觉此特性。

    create table t1(name varchar2(20),year number);
    insert into t1 values('t12001',2001);
    insert into t1 values('t12002',2002);
    insert into t1 values('t12003',2003);
    insert into t1 values('t12004',2004);
    insert into t1 values('t12005',null);
    insert into t1 values('t12006',2006);
    insert into t1 values('t12007',null);
    insert into t1 values('t12008',2008);
    insert into t1 values('t12009',2009);
    insert into t1 values('t12010',2010);
    
    --下面这样是查不到空的行
    select * from t1
    where year !=2001
    --要么下面这个
    select * from t1
    where year !=2001 or year is null;
    --要么下面这个,这个更方便
    select * from t1
    where lnnvl(year = 2001);
    
    LNNVL provides a concise way to evaluate a condition when one or both operands of
    the condition may be null. 
    lnnvl提供一个简明的方式来计算一个条件,当一个或条件的两个操作数可能为空时
    concise		adj. 简明的,简洁的
  • 相关阅读:
    python使用matplotlib:subplot绘制多个子图 不规则画图
    Python_matplotlib画图时图例说明(legend)放到图像外侧
    python ndarray与pandas series相互转换,ndarray与dataframe相互转换
    用Python实现excel 14个常用操作
    Python中保留两位小数的几种方法
    画图显示中文
    python命名规范
    Alpha阶段小结
    敏捷冲刺每日报告——Day5
    敏捷冲刺每日报告——Day4
  • 原文地址:https://www.cnblogs.com/createyuan/p/7048516.html
Copyright © 2011-2022 走看看