背景
在编写项目业务逻辑的时候,需要查询数据库表中一个字段中的值,但是这个值在该表中不存在,直接查询直接返回N/A,而不是null,在使用ifnull进行判断的时候,导致失效。
场景复现
步骤一:创建数据库表:role_info
CREATE TABLE `role_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`role` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色',
PRIMARY KEY (`id`) USING BTREE
)
步骤二:新增测试数据
INSERT INTO `role_info`(`id`, `role`) VALUES (1, 'super');
INSERT INTO `role_info`(`id`, `role`) VALUES (2, 'admin');
INSERT INTO `role_info`(`id`, `role`) VALUES (3, 'test');
步骤三:场景复现
数据库表数据:
navicat中执行下列SQL,由于“??”在数据库数据中不存在,则会导致查询的结果返回N/A。
select id from role_info where role = '??';
在使用ifnull的时候就出失效,使用后返回的数据还是N/A。如下:
select IFNULL(id,0) from role_info where role = '??';
返回N/A的原因
返回N/A的场景:
- 由于一些特殊条件或错误,导致查询结果为空的情况。
比如上述中的场景,条件中要查询的值是表中不存在的值,MySQL就会返回N/A。 - 在使用连接查询时,如果没有匹配的记录,也会返回N/A。
ps:在命令行下执行返回Empty Set,在Navicat中执行返回N/A。两个是同一回事。
上述场景的解决办法
方法一:聚合函数
聚合函数对N/A处理后会返回nulll。如下:
SELECT sum(id),avg(id),max(id),min(id) from role_info where role = '??' ;```
方法二:使用select进行再处理
select (select id from role_info where role = '??') temp;
这样再使用ifnull等对null进行逻辑运算就可以成功了。