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)结果如下:
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
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
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