oracle 对null值的处理

避坑指南:MTK平台Widevine L1密钥安装全流程详解(含SP META工具使用与Log分析) 本文详细解析了MTK平台实现Widevine L1认证的全流程,涵盖密钥申请、格式转换、安全烧录等关键步骤,特别针对Trustonic TEE环境下的SP META工具使用与日志分析提供实用指南。帮助开发者规避常见错误,确保DRM密钥安全部署,满足高端内容保护需求。 阅读详情

今天对oracle数据库中的null值进行了简单的总结。

NULL其实是数据库中特有的类型,它的特殊性使得在查询、处理、比较NULL值时和其他数据与众不同。当oracle数据库中某个列为null时,则这个列的值是未知的,是不确定的,既然是未知的,那么就存在无数种可能。因此,null并不是一个确定的值。

由于null存在着无数的可能,因此,除了对nullis nullis not null以外,对null的任何操作(=!=><>=<=+-*/)得到的结果仍然是null(也就是未知)。

那么在null的情况下,对null进行逻辑运算会是个什么情况呢?由于要考虑到null值的情况,所以布尔运算值从原来的truefalse这两个值,变成了现在的三个值:true,false,null。在oracle10g的环境下面,对null进行了逻辑运算,得到了以下结果:null AND nullnull OR nullnull AND truenull OR false的值都是未知的,这些的结果仍然是null。但是为什么 null and false(false),null or true(true)会得到一个确定的值呢?我们从null的概念考虑,由于null是未知,但是目前null的值就是布尔类型了,因此null只有可能是布尔类型中true或者false中的一个。根据true and false 和 false and false的结果全是false,也就是说不管null的值是true或者是false那么它与false进行and运算得到的结果仍然是false。同样的道理我们可以推算出null与true进行or运算时,得到的结果仍然是true。

在这里我们看一下null值在查询语句中where条件中的情况。

create table test_null(test_name varchar2(10),test_type varchar2(10));

insert into test_null values('test1','table');

insert into test_null values('test2','table');

insert into test_null values('test3','table');

insert into test_null values('t1','table');

commit;

 

SQL> select * from test_null;

TEST_NAME  TEST_TYPE
   ---------- ----------
   test1      table
   test2      table
   test3      table
   t1         table

 

SQL> select * from test_null where test_name in('test1','test2',null);

TEST_NAME  TEST_TYPE
    ---------- ----------
    test1      table
    test2      table

对test_name in ('test1','test2',null),可以这样理解,test_name = 'test1' or test_name = 'test2' or test_name = null;这时我们可以看成这样: TRUE OR TRUE OR NULL,根据上面的经验我们得到的结果是true(也就是有结果符合本条件);

 

 

SQL> select * from test_null where test_name not in ('test1','test2',null);

未选定行

对test_name not in('test1','test2',null),可以这样理解,test_name = 'test1' and test_name = 'test2' and test_name = null;这时我们可以看成这样:true and true and null得到的结果为null(也就是没有结果符合)。

 

null的not运算

既然我们有的时候可以把null看成是布尔类型,也就是可以存在not的运算了。下面我们看看对null值进行not的运算会是什么样的结果?

在pl/sql运算中我们得到的结果是:not null得到的结果仍然是null(由于null表示未知,而增加一个not后,并不能是null值成为一个确定的值,这里对null进行的是布尔操作)。

 

null和''的比较

以前我认为''等价于null,但是有些人喜欢钻牛角尖,所以我改一下说法,空字符串''是NULL的字符类型的表现格式,也许有人会认为,NULL就是NULL,本身没有类型的一说,但是我认为,NULL还是有类型的,只不过不同类型的NULL都用相同的关键字NULL来表示。而且,NULL本身也可以转化为任意类型的数据,因此给人的感觉是NULL没有数据类型。其实NULL不但有数据类型,还有默认的数据类型,那就是字符类型。不过上面说的这个默认的数据类型是在极限的情况下测试出来的,如果只是给出一个NULL,那么它是可以代表任意的类型的。

证明空字符串就是NULL是很容易:

SQL> select 1 from dual where '' is null;

         1
    ----------
             1

SQL> select dump(''),dump(null) from dual;

DUMP DUMP
    ---- ----
    NULL NULL

任意一个都足以证明空字符串’’就是null。

 

    这时我们会认为既然’’就是null,那么为什么没有’’ is ‘’的语句呢?原因就是is nulloracle 的语句,而’’ is ‘’不是oracle的语句,在编译期间就被oracle sql分析器给拦截了,根本就不能在运行期间给运行了。
     
那么我为什么还要说’’NULL的字符表示形式呢?因为’’NULL还确实不完全一样,对于NULL来说,它表示了各种数据类型的NULL值。而对于空字符串’’来说,虽然它也具有NULL的可以任意转化为其他任何数据类型的特点,但是无论是从形式上还是从本质上它都表现出了字符类型的特点。例如:

      Create or replace package p_test as

           Function test_return(test_in number) return varchar2;

           Function test_return(test_in varchar2) return varchar2;

      End;

select p_test.test_return(‘’) from dual; 正确

select p_test.test_return(null) from dual; 错误

 1 行出现错误:
ORA-06553: PLS-307: 
有太多的 'F_RETURN' 声明与此次调用相匹配。

从这一点上,我们就看出了’’已经具备了数据类型,所以将’’表述为空字符串是NULL的字符类型表现形式。

 

    看下面这个结果

    SQL> select null||'A'||'B'||null from dual;

    NULL

    ----

    AB

为什么用||操作符得到的结果不是null呢?原因就是nulloracle中的存储形式,下面我们就来看一下null字符在oracle中的存储形式,Oracle在存储数据时,先是存储这一列的长度,然后存储列数据本身。而对于NULL,只包含一个FF,没有数据部分。简单的说,Oracle用长度FF来表示NULL。由于Oracle在处理的数据存储的时候尽量避免0的出现,因此,认为这里FF表示的是长度为0也是有一定道理的。或者从另一方面考虑,NULL只有一个长度,而没有数据部分。

 

CTF-Web习题:2019强网杯 UPLOAD 本题涉及知识点:代码审计、文件上传漏洞、反序列化漏洞 阅读详情

相关推荐

Oracle数据库中NULL处理的全面解析与实战技巧

条件表达式UNKNOWNTRUEUNKNOWNFALSETRUEFALSEFALSETRUEFALSEFALSETRUEFALSE参数说明:若expr为NULL,则返回default;否则返回expr本身。:返回第一个非NULL参数,支持多层级回退。上述函数的本质是在语义层面填“未知”,从而将三逻辑降维至二逻辑,便于应用程序理解和处理。-- 更标准的方式:参数说明:MODIFY。

weixin_42323064的博客 1575

Oraclenull的常用处理方法

null处理 Null 不支持加减乘除,大小比较,相等比较,否则只能为空;只能用‘is [not] null’来进行判断; Max等聚合函数会自动“过滤null”正在上传…重新上传取消 null排序默认最大: 4.处理: 1)NVL(expr1,expr2): 当两个参数数据类型不同时,oracle会将两个参数进行隐式转换,如果不能隐式转换刚 会报错,隐式转换规则如下: 1.如果参数1为字符型,则把参数2转换为参数1的类型,返回为 VARCHAR2 ...

m0_58871547的博客 3378

Stata同时输出pearson和spearman相关系数,并标示出显著性星星

可能有人做相关系数分析时,需要将pearson和spearman相关系数同时输出到一张表格中,并且标识出星星,网上给出了很多方案,但都过于复杂,不太适合新手,于是乎,我封装了一个stata命令,叫pscorr,取名规则为pearson和spearman的首字母缩写,大家可以直接执行命令pscorr x1 x2 x3 x4即可输出一张既包含pearson相关系数,又包含spearman相关系数的表格。如下图所示,有需要的可以将下面的压缩包解压到Stata/ado/plus/p文件夹中,即可方便实用。举例如下:好像有不少人买这个相关系数表,一直比较懒,之前的命令很多人运行不出来,今天重新上传一个,如有需要请购买这个。 相关系数.do (335 Bytes, 需要: RMB 5 元)

oracle字段长度不足位数

oracle字段长度不足位数零 假如原始为1,往左零,实现如下 select lpad(‘1’, 5, ‘0’) from dual; 执行结果如下: 【注意】 1、第一个参数为待字符;第二个参数表示齐后的总字符长度;第三位表示不足时什么字符; 2、lpad是左侧0,右侧0可用rpad ...

tnb_ml的博客 6680

NULL 和空

mysql:select length(NULL), length(''), length('a'); 在mysql中空(’’)的长度是0,是不占用空间的;而的NULL长度NULL,其实它是占用空间的(NULL列需要行中的额外空间来记录它们的是否为NULL) 使用 COUNT(字段) 统计会过滤掉 NULL ,但是不会过滤掉空 IFNULL有两个参数。 如果第一个参数字段不是NULL,则返回第一个字段的。 否则,IFNULL函数返回第二个参数的(默认Oracle: select.

捣蛋的博客 1300

Oracle中的NULL

很多时候会这样总结NULL,除了IS NULL、IS NOT NULL以外,对NULL的任何操作的结果还是NULL。 由于NULL是未知,所以NULL AND NULLNULL OR NULLNULL AND TRUE和NULL OR FALSE的都是未知的,这些的结果仍然

NowOrNever 2万+

Spring集成Redis

最近在做一个关于群聊的项目,由于聊天要求实时性,不可能直接访问数据库,所以使用了Redis来做缓存,这里将使用过程中遇到的问题记录一下。使用Redis之前需要合理设计存储在其中的数据结构,比如聊天系统,就需要存储包括用户登录状态信息,可以使用Hash数据结构,以用户Id做键,状态做,还可以存储每个用户在每个群的未读消息计数,客户端使用长轮询拉取。最主要的就是群里的聊天记录的缓存了,这里可以使用R...

Terisadeng的博客 1308

Oracle null处理

Oracle null处理 数据库处理null特点:除了nvl()函数之外,任何函数、运算符遇到null 或者’’ 的数据都会被过滤掉 备注:oracle数据库中 null <==> ‘’ with T as (SELECT '101' ID,null as the_name from dual) SELECT 1 "序号",count(*) NUM FROM T unio...

zhouxzcsdn的博客 1283

Oracle中聚合函数对NULL处理

了解这些行为对于编写正确的聚合查询非常重要,特别是在处理可能包含NULL的数据时。2. GROUP BY分组时,所有NULL会被分到同一组。特别注意avg这个关于null的,下面示例: ```

ITHomeZSL的博客 491

oracle order by 处理null

from : http://www.cnblogs.com/modou/articles/1869710.html 【转】oracle order by 处理NULL 适用情况: oracle 对查询结果进行排序时,被排序的栏位存在null,且要指定NULL排在最前面或者最后面 关键字:Nulls First;Nulls Last 大>,nul

221

Oracle 常用的NULL处理方法

1、缺省处理 Oracle在Order by 时缺省认为null是最大,所以如果是ASC升序则排在最后,DESC降序则排在最前 2、使用nvl函数 nvl函数可以将输入参数为空时转换为一特定,如 nvl(employee_name,’张三’)表示当employee_name为空时则返回’张三’,如果不为空则返回employee_name 通过这个函数可以定制nu...

dexu1611的博客 258

oracle count()函数对null处理

count() 括号中如果是列名的话则不包含NULL 如果是*字符或常量 则包括NULL

寸草心的博客 5301

Oracle NOT IN反连接中null处理和疑问

Oracle NOT IN反连接中null处理和疑问 若有sql使用not in写法如下: 其中t和tt表的col列没有not null限制,这个时候一旦子查询中出现null,会导致整个sql没有结果输出。 select count(*) from t where t.col not in (select tt.col from tt); 为啥,比如where id not in (1...

PiscesCanon的博客 253

Oracle order by 处理NULL

Oracle order by 处理NULL 1、缺省处理 Oracle在Order by 时缺省认为null是最大,所以如果是ASC升序则排在最后,DESC降序则排在最前 2、使用nvl函数 nvl函数可以将输入参数为空时转换为一特定,如  nvl(employee_name,’张三’)表示当employee_name为空时则返回’张三’,如果不为空则返回em

meimonkey的专栏 568

Oracle排序中NULL处理的五种常用方法

1、缺省处理 Oracle在Order by 时缺省认为null是最大,所以如果是ASC升序则排在最后,DESC降序则排在最前 2、使用nvl函数 nvl函数可以将输入参数为空时转换为一特定,如 nvl(employee_name,’张三’)表示当employee_name为空时则返回’张三’,如果不为空则返回employee_name 通过这个函数可以定制null的排序位置。 3、使用decode函数 decode函数比nvl函数更强大,同样它也可以将输入参数为空时转换为一特

活跃的技术客 2390

oracle order by 处理NULL

【转】oracle order by 处理NULL 适用情况: oracle 对查询结果进行排序时,被排序的栏位存在null,且要指定NULL排在最前面或者最后面 关键字:Nulls First;Nulls Last 大>,null排在最後;desc 降序小>,null排在最前面)" style="background-color:rgb(255

YSOLA4的专栏 946

oracle,hive,mysql对null的不同处理方式,以及各自的函数

不同的数据库处理null有一定的区别,记录一下oracle,hive,mysql对null的不同处理方式,以及各自的函数,面试中也可能会被问道

xw486223221的博客 1118

oracle order by nulls last,Oracle order by 处理NULL

1、缺省处理Oracle在Order by 时缺省认为null是最大,所以如果是ASC升序则排在最后,DESC降序则排在最前2、使用nvl函数nvl函数可以将输入参数为空时转换为一特定,如nvl(employee_name,’张三’)表示当employee_name为空时则返回’张三’,如果不为空则返回employee_name通过这个函数可以定制null的排序位置。3、使用decode函数d...

weixin_39658966的博客 2519

Oracle与SQL Server SQL 判断处理null方法

sql server1.替换null:isnull(arg,value)如:select isnull(price,0.0) from orders2.与null比较: is not null,is null如:select * from orders where price i

一个情绪猿的脖克... 6023
上一篇: oracle utl_file包的使用
下一篇: ORACLE 中ROWNUM用法总结
OracleJ
博客等级 码龄20年 25粉丝 22原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值