问题背景
出现这个问题的原因是在测试过程中,对于我要分组的类型在不同人存数据时出现了空白值和NULL两种情况(胡闹!),导致我之前的分组查询会出现NULL一个分组,空白值一个分组,由于业务上的需求是没有值的归类为其他(虽然在真实使用时99.99999%不会出现这个null或者空白值乱传问题,但强迫症的我决定重拳出击),为了不改变我的代码整体结构,我决定在SQL上做文章。
废话不多说,先贴解决方案
SELECT
COUNT (ID) AS fileCount,
SUM (file_storage) AS fileStorage,
CASE
COALESCE (file_type, '') //如果是MySQL直接写 file_type即可
WHEN ''
THEN'other' //要将空白值替换成的值 (这里如果不需要替换值也可以使用NULLIF,看清楚是NULLIF)
ELSE COALESCE (file_type, '') //在MySQL中相当于IFNULL
END fileType //如果字段需要与实体类中对应,可在这里设置,直接写别名就可以哦!
FROM
cloudoffice.file_virtual_info
//如果需要条件的话,在这里写WHERE啊什么的,自行发挥,跟平时写都一样的
GROUP BY
COALESCE (file_type, '')
在这里我对这个SQL进行一下解释说明:
1.COALESCE函数:由于我使用的是Postgre数据库,所以与MySQL存在差异,如果你使用的是MySQL数据库的话,替换成IFNULL函数即可(如果不需要替换值话,也可以使用NULLIF,看仔细是NULLIF);
2.如果你是用的是MySQL数据库的话,在CASE后面可以直接写字段名即可;
3.如果你想给这个字段起别名的话,在END后面添加别名即可;
4.如果在MySQL中出现了如下问题(切记是MYSQL中,我只在MYSQL中出现了该问题);
Expression #2 of SELECT list is not in GROUP BY clause and contains
nonaggregated column ‘xxx’ which is not functionally
dependent on columns in GROUP BY clause; this is incompatible with
sql_mode=only_full_group_by
可以尝试在SQL中运行下方语句重新进行设置(大多数情况下这样做是可以解决的)
set @@global.sql_mode
='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
切记设置之后要重启你的数据库工具!!!
(我并没有过多解释所出现的这个问题(不求甚解嘛嘻嘻),感兴趣的话,可以复制搜索一下我上面贴出的问题(中间那条),有很多文章讲其他解决方案和出现的原因)