博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL中的Null值
阅读量:6865 次
发布时间:2019-06-26

本文共 1314 字,大约阅读时间需要 4 分钟。

  hot3.png

Null是表示一种“未知”的类型,除了SQL已定义的数据类型外其他都是“未知”的类型。

  • Null不支持大小/相等判断

    Null是“未知”类型,既然“未知”类型,那就无法判断一个未知类型或一个已知类型与一个未知类型是否相等或大或小。于是下面这个sql语句返回的是NULL

select null > 0;select null < 0;select null = 0;

判读是否是Null的方式是使用is null 或者 is not null

select 1 is not null;
  • [not] in 与 Null

    例如:x not in (1,2,null) 等价于 x !=1 and x!=2 and x!=null 因为null与任何值比较都返回null所以一旦in后面的货号里有null值则整个查询结果都为null.

    相反的如果是x in (1,2,null),则等价于是x=1 or x=2 or x=null,同理这种情况null会被忽略.

  • Null与排序与比较

    在排序时可以使用coalesce函数将Null转换成0,coalesce的功能:

COALESCE (expression_1, expression_2, ...,expression_n)依次参考各参数表达式,遇到非null值即停止并返回该值。如果所有的表达式都是空值,最终将返回一个空值。使用COALESCE在于大部分包含空值的表达式最终将返回空值。

例如coalesce(age, 0)这样就可以将age为null的默认转换成0.排序时如果排序字段为null则会排在最前面,如果不想让这些null值记录排在前面,就可以使用coalesce函数消除null:
select * from user order by coalesce(age,0)

同理在比较的大小的时候也可以这样做,如果业务里Null等价于0(或者其他值)则可以用coalesce转换一下,例如:

select * from good where coalesce(price,0) > 55.5;select * from user where coalesce(age,0) in (,10,20,30);
  • 被 0 除

    除数为0是一个非常 egg-painfull 的错误。昨天还运行得好好的SQL,突然被0除一下子就出错了。一个常用的解决方法是先用 case 语句判断分母(denominator)是否为0,再进行除法运算。这种方式其实很难看,而且分母被重复使用了。如果是简单的情况还好,如果分母是个很复杂的表达式,那么悲剧就来了: 很难读,很难维护和修改,一不小心就是一堆BUG. 这是就可以使用null来解决,因为null除任何数都是null,所以可以使用nullif函数将可以能为0的值转出null(如果需要还可以再使用coalesce函数将null再转成其他值)

select coalesce(total_sales/nullif(num_users, 0), 0);

转载于:https://my.oschina.net/admq/blog/758395

你可能感兴趣的文章
LINQ 表达式树
查看>>
我的友情链接
查看>>
使用python监控memcached基本信息
查看>>
Exchange 分析器工具
查看>>
sql server 2012提示评估期已过的解决方法:
查看>>
【产品需求文档】添加新的运输/快递方式
查看>>
javascript 之 slice方法
查看>>
Azure实践系列 2:Azure AD中的用户管理
查看>>
MyEclipse的Web项目开发:Maven插件jetty服务器的关闭
查看>>
js 验证手机号码
查看>>
让搜索引擎快速收录网站
查看>>
我的友情链接
查看>>
虚拟机中安装Centos
查看>>
MySQL数据库MyISAM存储引擎转为Innodb
查看>>
expdp和impdp常用参数
查看>>
我的友情链接
查看>>
35 个你也许不知道的 Google 开源项目
查看>>
CentOS minimal 安装
查看>>
线程通信之looper之用法--主线程和工作线程
查看>>
web前端开发工程师必备技能
查看>>