oracle多字段排序空值处理,MYSQL、SQLServer、Oracle数据库排序空值null问题及其解决办法...

5268f80b9b1e01f982625ef6fac83ca1.png

【sqlserver】: sqlserver 认为 null 最

【sqlserver】:

sqlserver 认为 null 最小。

升序排列:null 值默认排在最前。

要想排后面,则:order by case when col is null then 1 else 0 end ,col

降序排列:null 值默认排在最后。

要想排在前面,则:order by case when col is null then 0 else 1 end , col desc

【oracle】:

oracle认为 null 最大。

升序排列,默认情况下,null值排后面。

降序排序,默认情况下,null值排前面。

有几种办法改变这种情况:

(1)用 nvl 函数或decode 函数 将null转换为一特定值

(2)用case语法将null转换为一特定值(oracle9i以后版本支持。和sqlserver类似):

order by (case mycol when null then '北京漂客' else mycol end)

(3)使用nulls first 或者nulls last 语法。

这是oracle专门用来null值排序的语法。

nulls first :将null排在最前面。如:select * from mytb order by mycol nulls first

null last :将null排在最后面。如:select * from mytb order by mycol nulls last

如果要想让含有null的列按照自己的意愿进行排序,可做如上处理。

【mysql】:

MySQL同sqlserver,null默认最小,解决办法同sqlserver

注意:

1、null的列作为查询条件时,无论使用>/>=/<=都是不符合条件的,只能使用isNull来判断。如下:

test.jsp?url=http%3A%2F%2Fhi.csdn.net%2Fattachment%2F201111%2F2%2F0_13202028226CT2.gif&refer=http%3A%2F%2Fblog.csdn.net%2Fsmcwwh%2Farticle%2Fdetails%2F6927613

id为4的age字段为空,

执行SQL:select * from student where age >= 30; 结果如下:

test.jsp?url=http%3A%2F%2Fhi.csdn.net%2Fattachment%2F201111%2F2%2F0_13202029339Bmb.gif&refer=http%3A%2F%2Fblog.csdn.net%2Fsmcwwh%2Farticle%2Fdetails%2F6927613

执行SQL:select * from student where age < 30; 结果如下:

test.jsp?url=http%3A%2F%2Fhi.csdn.net%2Fattachment%2F201111%2F2%2F0_1320202999YDAN.gif&refer=http%3A%2F%2Fblog.csdn.net%2Fsmcwwh%2Farticle%2Fdetails%2F6927613

只有执行SQL:select * from student where age is null; 才能查询出age为null的数据。

2、对null做加、减、乘、除等运算操作,结果仍为空

刚开始student表数据如下:

test.jsp?url=http%3A%2F%2Fhi.csdn.net%2Fattachment%2F201111%2F2%2F0_1320203419EPGI.gif&refer=http%3A%2F%2Fblog.csdn.net%2Fsmcwwh%2Farticle%2Fdetails%2F6927613

执行SQL:update student set age = age + 20;

执行SQL:select * from student; 结果如下:

test.jsp?url=http%3A%2F%2Fhi.csdn.net%2Fattachment%2F201111%2F2%2F0_1320203472cmQm.gif&refer=http%3A%2F%2Fblog.csdn.net%2Fsmcwwh%2Farticle%2Fdetails%2F6927613

非null的age字段都更新为+20,而null字段依然为空。

上面的测试数据库为MySQL,Oracle也一样。SQL Server没测试过,应该也是一样的。

空值

列可以接受或拒绝空值。在数据库内 NULL 是特殊值,代表未知值的概念。NULL 不同于空字符或 0。空字符实际上是有效字符,0 是有效数字。而 NULL 只是表示该值未知这一概念。NULL 也不同于零长度字符串。如果列定义中包含 NOT NULL 子句,则不能为该行插入含有 NULL 值的行。如果列定义中仅包含 NULL 关键字,则接受 NULL 值。

在列内允许 NULL 值会增加使用该列的逻辑比较的复杂性。SQL-92 标准规定:对 NULL 值的任何比较都不取值为 TRUE 或 FALSE,而是取值为 UNKNOWN。此规定在比较运算符中引入了三值逻辑,而要正确运用该逻辑很困难。[摘自Microsoft SQLServer联机丛书]

SQL中null值索引优化的文章:

【摘】SQL优化:NULL值与索引的使用

1428d0e076c3959ab11d28a39bc84fab.png

5268f80b9b1e01f982625ef6fac83ca1.png

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值