当前位置:  数据库>oracle

Oracle中的NULL和空字符串

    来源: 互联网  发布时间:2017-04-18

    本文导语: 在Oracle中有个关键字叫NULL,它表示某个值是未知的、是不确定的。既然是未知的,就有无数种的可能性。因此,NULL并不是一个确定的值。先看两个例子吧: 例1: declare  v_b1 boolean:=null; --布尔值可以赋值null.当然它另外两种值只能是...

在Oracle中有个关键字叫NULL,它表示某个值是未知的、是不确定的。既然是未知的,就有无数种的可能性。因此,NULL并不是一个确定的值。先看两个例子吧:

例1:

declare 

v_b1 boolean:=null; --布尔值可以赋值null.当然它另外两种值只能是true,false了

v_a int := null; 
v_b int := null;      --整数可以给它赋值null
v_s  varchar2(20):= null ; --字符也可以赋值null
begin
if(v_a= v_b) then          --v_a 和v_b都是null但此处判断的结果是它们并不相等.改成v_a =null结果仍然是一样
dbms_output.put_line('v_a equal v_b');
else
dbms_output.put_line('v_a not equal v_b');--输出这个结果
end if;







if(v_b1) then          --把v_b1改成not v_b1结果都一样.也就是v_b1和把它取反都不会是true
dbms_output.put_line('v_b1 equal true');
else
dbms_output.put_line('v_b1 is not true');--输出这个结果
end if;



if(true or v_b1) then          --输出v_b1 equal true
dbms_output.put_line('v_b1 equal true');
else
dbms_output.put_line('v_b1 is not true'); -- 如果把前面的判断条件改成true and v_b1 则输入这条语句
end if;
end;





例2:

create table test (ename char(1),constraint ck_test check(ename in ('a',null)));

--上面的语句创建一个表,只有一列ename,给此列添加约束条件,它的值只能在列表('a',null)中.但实际上我们可以插入任何字符.这时貌似null可以代表所有的字符了.去掉它只能插入'a'

但如果我们这样创建表

create table test1 (ename char(1),constraint ck_test check(ename not in ('a',null)));

--按我们猜想如果null能代表所有字符了那它取反就是不能输入任何字符.但实际上不是.此处它貌似没起任何作用.去掉它和不去掉效果一样.都可以插入除'a'外的任何字符


1.怎么理解null的这些用法

看了上面两个例子是不是有点晕了啊,其实我们可以这样理解.既然null是个不确定的类型,就可以转变成任何类型中的任何值.就像C#中的object类型.它是任何类型的父类.可以代表任何类型.我们可以在运行程序时再去动态确定它的具体类型.那么null如果是处在一个条件判断条件中得让它取特定类型的所有值去进行判断.如果结果都为真才为真.

如例1中两个整数值v_a,v_b都是null.要让他们相等得让null取所有的整数去判断.那样自然不可能都相等.所以为假.而true or v_b1之所以为真了是因为or前面的为真的话不去对后面的v_b1做判断了.而v_b1和not v_b1都为假则可以认为v_b1可以取true和false,把这两种值都代入则不可能保证都为true所以最终结果为false.

这样来理解了null就不难明白为什么我们在一个表中插入一个null值.但我们不能通过判断条件=null来查询.不过oracle提供了关键字is来判断一个值是否是null.

例2中第二种情况是有点反常.我们就当作如果什么都不让用户插入,但建个表没啥意义.所以不这样

至于Oracle后台是怎么存储null值和操作null值的就不清楚了啊.


2.null和空字符串

其实空字符串和其他字符的操作是一样的.只是用它的时候眼神要好点,别搞错了.举个例子

先建表create table arwen(ename varchar2(1)); --此列只能插入一个字符

insert into arwen values(' ');--注意引号中是一个空格.如果是两个空格会出错的,因为是两个字符了.

select * from arwen where ename = ' '; --返回一行.这里引号中也必须是一个空格.

如果是''也就是引号中没空格.那插入它时Oracle默认把它变成null了.所以如果引号中没空格我们就不能叫它空字符串了啊.不知道叫啥好啊.觉得有null了它好像有点多余

例如create table arwen(eno int);

insert into arwen values(44);

insert into arwen alues(''); --引号是没有空格

insert into arwen alues(null);

这上面三条语句都会成功插入.

虽然''被默认转换成null但我们不能用is '' 或=''来用它

例如你select count(*) from arwen 或者select count(*) from arwen where ename is null--结果是3 

但如果是select count(*) from arwen where ename is ‘’ 或者 select count(*) from arwen where ename =‘’结果就是0


3.我们要用到null时常会用到函数nvl函数.

就是如果碰到哪个地方是null就把它转换成其他的东东

例如上面插入三行后我们这样查找select nvl(ename,11) from arwen; --结果是44     11     11

ename如果是null就转换成11如果不是null就原样输出



4.使用null时注意

在用avg,max,min这些函数时会把null忽略掉

比如create table arwen(eno int);

insert into arwen values(1);

insert into arwen values(2);

insert into arwen values(null);

select avg(eno) from arwen;--结果为1.5.这是因为忽略掉null了不然应该是1的

select max(eno) from arwen;--结果为2

如果在排序中会把null当作最大值处理.就像无穷大一样


在往表中插入数据时如果某列没有插入值就让它为null,这对用户来说是非常方便的.但在其他地方用它好像没太大必要.所以尽量别用好了. 只是在对表做些操作时多注意考虑到null判断就好.多用nvl函数和is null判断








    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3