mysql null值比较及排序注意事项

版权声明:本文为博主原创文章,转载请注明出处! https://blog.csdn.net/chuangxin/article/details/86754141

在表结构设计的时候,有些列比如主键、关键字段会设置为not null表示必须有值,而有些字段则设置为允许null表示可以为空,如:备注信息等。对于那些允许null的字段,我们在进行比较或排序的时候需要做些特殊处理。

1、null值比较

先看个订单表的表结构,订单备注(bill_memo)允许null,且经常可能是空字符串。

CREATE TABLE `sale_so_bill` (
  `sid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `bill_date` date NOT NULL COMMENT '单据日期',
  `bill_no` varchar(30) NOT NULL COMMENT '单号',
  ...
  `goods_money` decimal(20,4) NOT NULL COMMENT '订单金额',
  `goods_ps` decimal(20,4) DEFAULT NULL COMMENT '优惠金额',
  `bill_memo` varchar(200) DEFAULT NULL COMMENT '备注',
  ...
  PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='销售订单主表'

判断bill_memo是否为null需要使用is nullis not null进行判断,而不能使用bill_memo = null,如判断订单是否有备注可以如下:

select a.* from sale_so_bill a where a.bill_memo is not null; ->有备注
select a.* from sale_so_bill a where a.bill_memo is null; ->没备注

但是实际应用中很有可能用户就是输入了“空格”,空字符串也属于“没备注”,为此我们需要修改下判断条件,将null值转换为’'然后进行比较,mysql提供了2个转换函数:

  • coalesce(bill_memo, ‘’), if bill_memo is null 则返回 ‘’ 否则返回 bill_memo,sql标准函数,大部分数据库都支持
  • ifnull(bill_memo, ‘’), if bill_memo is null 则返回 ‘’ 否则返回 bill_memo

新判断条件sql如下:

-- 有备注,排除null值和空字符串
select a.* from sale_so_bill a where ifnull(bill_memo, '') !='';
select a.* from sale_so_bill a where coalesce(bill_memo, '') !='';

2、null值sum汇总处理

对null值进行sum求和等算数运算时,若符合条件的记录,计算列值都为null,则sum结果也为null,为了返回结果友好性,我们需要将null值转为0然后进行求和,sql如下:

select sum(goods_money),sum(coalesce(goods_ps,0)) from sale_so_bill where ...

3、null值排序问题

  • asc时,null值会排在最前面
  • desc时,null值会排在最后面
select bill_memo bm, a.* from sale_so_bill a order by bill_memo asc; -> null值在最前面
select bill_memo bm, a.* from sale_so_bill a order by bill_memo desc; ->null值在最后面

如果我们要实现null值等同空字符串进行排序,则可以先使用ifnull或coalesce进行处理,然后再排序,如下:

select bill_memo bm, a.* from sale_so_bill a order by ifnull(bill_memo, '') asc

猜你喜欢

转载自blog.csdn.net/chuangxin/article/details/86754141