mysql中ifnull和isnull对null值的判断有区别吗?为什么判断结果会不同

时间:2022-05-01 11:50:31
测试如下:
  CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a` varchar(255) CHARACTER SET utf8 NOT NULL,
  `b` varchar(255) CHARACTER SET utf8 NOT NULL,
  `c` decimal(14,2) NOT NULL DEFAULT '0.00',
  `d` int(255) NOT NULL DEFAULT '0',
  `e` varchar(255) CHARACTER SET utf8 NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci ROW_FORMAT=COMPACT;

-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES ('1', 'a', '0', '1.10', '2', 'aa');
INSERT INTO `test` VALUES ('2', 'a', '1', '2.10', '3', 'bb');
INSERT INTO `test` VALUES ('3', 'b', '0', '1.40', '4', 'cc');
INSERT INTO `test` VALUES ('4', 'b', '1', '2.10', '5', 'ded');

1)测试语句如下:
select a,b,IFNULL(a,'合计') a1, if(ISNULL(a),'合计',a) a2,sum(c) c from test group by a,b with ROLLUP
2)结果如下:
mysql中ifnull和isnull对null值的判断有区别吗?为什么判断结果会不同
3)通过上面红色区域,可以看到,通过ifnull,能判断出null值,通过isnull,没有判断出

为什么会出现这种情况?是我的用法不对吗?

2 个解决方案

#1


加个isnull(a)列可以看到这个是0  非null

#2


应该算 BUG 吧

a/b 列的定义是 NOT NULL, 所以 ISNULL 的结果始终是0, 如果你把列定义改成 NULL, 则 ISNULL 就对了
ISNULL 看起来是直接检查列定义的 NOT NULL 属性,如果是 NOT NULL,则不再数据上判断
你可以用 
create temporary table tt select a, b, sum(c) as c from test group by a, b with rollup;
这样就会收到错误: ERROR 1048 (23000): Column 'b' cannot be null

#1


加个isnull(a)列可以看到这个是0  非null

#2


应该算 BUG 吧

a/b 列的定义是 NOT NULL, 所以 ISNULL 的结果始终是0, 如果你把列定义改成 NULL, 则 ISNULL 就对了
ISNULL 看起来是直接检查列定义的 NOT NULL 属性,如果是 NOT NULL,则不再数据上判断
你可以用 
create temporary table tt select a, b, sum(c) as c from test group by a, b with rollup;
这样就会收到错误: ERROR 1048 (23000): Column 'b' cannot be null