TDengine 2.0版本count()无数据时不返回0 MyBatis处理问题问询
问题根因
你遇到的是TDengine 2.0.x分支的已知缺陷,该版本下聚合查询无匹配数据时,count()等聚合函数会返回空结果集而非符合SQL标准的0值,该问题在2.2.0及之后的正式版本已官方修复。
可行解决办法
- 方案1:应用层兼容(改造成本最低,无需调整数据库和SQL)
MyBatis侧将对应查询方法的返回值设置为包装类Integer而非基础类型int,拿到返回结果后手动做空值判断替换为0即可,示例代码如下:
// Mapper接口定义 Integer countEntranceData(); // 业务层处理 Integer count = mapper.countEntranceData(); int finalCount = count == null ? 0 : count;
- 方案2:SQL层面兼容(无需调整代码和数据库版本)
通过union补默认值的方式保证SQL一定会返回结果,示例写法如下:
select max(cnt) as `count(*)` from ( select count(*) as cnt from d_entrance_data union all select 0 as cnt ) t;
该写法下当原count查询无结果时,会取union的0值,有结果时会取实际统计值,完全符合预期。
- 方案3:升级TDengine版本(彻底修复)
将TDengine集群升级到2.2.0及以上的稳定版本,官方已经在新版本中修复了该聚合函数返回值不符合SQL标准的问题,升级后原有count查询无需修改即可正确返回0。
内容的提问来源于stack exchange,提问作者hook capt
相关产品推荐
相关产品推荐

