Oracle“不等于号”与Nulls的情况(转)

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

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

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

而实际上,它只返回不为null且不等于500的记录,见如下测试。

 

使用SCOTT的公共数据测试:

--All data

--Not equal 500(Not contain null)

--Not equal 500(contain null)


--Not equal 500(contain null ,use lnnvl())


lnnvl用于某个语句的where子句中的条件,如果条件为真就返回真,否则为假。

其含义可理解为LNNVL:IS NULL or IS NOT TRUE

它的优势在于处理简单条件判断无法实现的null条件

  

 

事实上,并不仅仅“不等于号”与Null的关系是如此的,其他操作符也类似,只不过“不等于号”使用场景的特殊性让我们容易发觉此特性。

其中原因在于Null,关于Null的种种情况可见以下Oracle的文档:

 

http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements005.htm

http://www.cnblogs.com/nick-huang/p/3921605.html

 lnnvl

http://note.youdao.com/share/?id=34f04728448eb41b5f7a5203a22713c5&type=note

 

时间: 2024-09-11 04:25:39

Oracle“不等于号”与Nulls的情况(转)的相关文章

浅析Oracle中的不等于号

前几天碰到一个关于Oracle不等于的问题,最后搜索了一下,发现下面资料,拿来跟大家分享一下,需要的朋友可以参考下   关于Oracle中的不等于号: 在Oracle中, <> != ~= ^= 都是不等于号的意思.都可以使用. 但是奇怪是的, 我想拿出price不是180000的商品时:(price是Number类型的) SELECT id, name  FROM product where price<> 180000; 执行这个语句时,priceis null  的记录不出来

通过JDBC操纵Oracle数据库LOB字段的几种情况分析

oracle|数据|数据库 通过JDBC操纵Oracle数据库LOB字段的几种情况分析纵横软件制作中心 雨亦奇2003-6-10 15:14:19在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种类型的字段,很灵活,适用于数据量非常大的业务领域(如图象.档案等).而LONG.LONG RAW等类型的字段,虽然存储容量也不小(可达2GB),但由于一个表中只能有一个这样类型的字段的

超链接传参-jsp中超链接传值由于值中存在大于号等于号等特殊符号传不过去求解

问题描述 jsp中超链接传值由于值中存在大于号等于号等特殊符号传不过去求解 <script type="text/javascript"> function dianji(){ window.location.href="/tzfw/projectQuery!queryMobileXMList.action?S_SPECIAL_ID='bad5fdacbc0d4ecd>=8bb578d7669>@a2fb'"; } </script&g

c#4 0-C#正则表达式如何取出某字符串等于号后的括号前的数据

问题描述 C#正则表达式如何取出某字符串等于号后的括号前的数据 (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = ahnu)(PORT = 1521)))(CONNECT_DATA = (SID =orcl)))如何取出host等于什么,Port等于什么,sid等于什么 解决方案 <?<=[A-Z]+s=>[A-Z]+ 解决方案二: PROTOCOL=.*)? PORT=.*)? 解决方案三: 这样写为什么

javaScript中两个等于号和三个等于号之间的区别介绍_基础知识

一言以蔽之:==先转换类型再比较,===先判断类型,如果不是同一类型直接为false. ===表示恒等于,比较的两边要绝对的相同 alert(0 == ""); // true alert(0 == false); // true alert("" == false); // true alert(0 === ""); // false alert(0 === false); // false alert("" === fal

Oracle 8x监控sysdba角色用户登陆情况_oracle

正在看的ORACLE教程是:Oracle 8x监控sysdba角色用户登陆情况. 在Oracle 8i版本之前,使用internal用户来执行数据库的启动和关闭以及create database等操作:从8i版本以后,Oracle已经逐渐淘汰了internal用户,采用授与sysdba或者sysoper角色的用户才可以执行数据库的启动和关闭等操作,为保持用户习惯在8i中依旧保留了internal用户和svrmgrl,但已完全可以不使用svrmgrl工具和internal用户了.最新发布的orac

oracle中scn号是commit之后产生的,还是commit之前产生的?

问题描述 oracle中scn号是commit之后产生的,还是commit之前产生的? 如果是commit之后产生的,那么在commit之前scn都没有,还怎么用比较scn号大小的方法来实现读一致性呢? 假设scn号是在commit之后产生的,在判断读一致性时是根据scn号的大小去控制的,比如事务开始时最大的scn号是1000,当读到此事务开始之后有人修改过但未提交的数据时,比如这次修改的scn是1001,系统一看比事务开始时最大的scn号1000还大,就直接去undo中读取被修改之前的数据来保

oracle中 SCN号总结 上篇

1.SCN(System Change Number) : SCN是什么? system change number (SCN)是一个非常重要的标记,Oracle使用它来标记数据库在过去时间内的状态和轨迹.Oracle使用SCN来保 存所有变化的轨迹.SCN是一个逻辑时钟来记录数据库事件.它非常的重要,并不是只是为了恢复.SCN的最大值是0xffff.ffffffff.SCN有点类似于sequence,Oracle 在SGA中增加它.当一个事务修改或者插入数据,Oracle首先写入一个新的SCN

ORACLE SEQUENCE跳号总结

      在ORACLE数据库中,序列(SEQUENCE)是使用非常频繁的一个数据库对象,但是有时候会遇到序列(SEQUECNE)跳号(skip sequence numbers)的情形,那么在哪些情形下会遇到跳号呢?     事务回滚引起的跳号     不管序列有没有CACHE.事务回滚这种情况下,都会引起序列的跳号.如下实验所示:   SQL> create sequence my_sequence   2  start with 1   3  increment by 1   4  ma