`
lovnet
  • 浏览: 6712484 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

Oracle中的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判断





分享到:
评论

相关推荐

    Oracle9i的init.ora参数中文说明

    值范围: Oracle8i National Language Support Guide 中指定的任何有效的10 字节字符串。 默认值: BINARY nls_currency: 说明: 为 L 数字格式元素指定用作本地货币符号的字符串。该参数的默认值由 NLS_TERRITORY ...

    VC++6.0核心编程源码.rar

    该函数之所以有这样大的作用,原因之一是它很容易用多种语言来进行操作。该函数能够检测出用户首选的语言(在Regional Settings Control Panel小应用程序中设定),并返回相应的文本。当然,你首先必须自己转换字符...

    Perl 实例精解(第三版).pdf

    读者可以很容易地通过这些范例掌握Perl语言的语法。附录含有完整的函数和定义、命令行开关、特殊变量、常见模块和Perl调试器的列表,全功能的、面向对象的CGI程序,一些有用的脚本,以及很有帮助的HTM教程。 本书...

    JAVA面试题最全集

    编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串。 9.Java中访问数据库的步骤,Statement和PreparedStatement之间的区别。 10.找出下列代码可能存在的错误,并说明原因: 二、JSP&Servlet...

    java 面试题 总结

    JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变...

    SQL性能优化

    但是从ORACLE共享内存SGA的原理,可以得出ORACLE对每个SQL 都会对其进行一次分析,并且占用共享内存,如果将SQL的字符串及格式写得完全相同则ORACLE只会分析一次,共享内存也只会留下一次的分析结果,这不仅可以减少...

    超级有影响力霸气的Java面试题大全文档

     JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    对Web技术的支持,使用户能够很容易地将数据库中的数据发布到Web页面上。  7.SQL Server提供数据仓库功能,这个功能只在Oracle和其他更昂贵的DBMS中才有。  SQL Server 2000与以前版本相比较,又具有以下新特性...

    springmybatis

    其实还有更简单的方法,而且是更好的方法,使用合理描述参数和SQL语句返回值的接口(比如IUserOperation.class),这样现在就可以至此那个更简单,更安全的代码,没有容易发生的字符串文字和转换的错误.下面是详细...

    经典全面的SQL语句大全

     这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如...

    jpivot学习总结.doc

    name Hierarchy 的名称,该值可以为空,为空时表示 Hirearchy 的名字和 Dimension 的名字相同。当一个 Dimension 有多个 Hierarchy 时,注意 name 值要唯一。 hasAll 布尔型的 , 决定是否包含全部的成员 member ...

Global site tag (gtag.js) - Google Analytics