新鲜出炉的sql, 竟在mybatis中惨遭滑铁卢.....

前情提要:

一个简单的条件: 让 表A.字段1 between 表B.字段1 and 表B.字段2 .

语句如下:

select  
distinct 
case when a.common1 between b.level1 and b.level2 then b.value1 else 0 
end as pft2
from 
tableA a 
inner join tableB b
on  a.id = b.id
where ...........

mysql 版本: 5.8

但是在实现的时候, 却发现了意料之外的事情,




当我实现完毕, 在测试之时,发现结果无论如何也不对.
因为我模拟了 7条数据, 可结果只有6条数据

于是就开始bug追查.

从mybatis控制台的日志中取出打印出来的 sql语句
把sql语句分别执行

mysql数据库中执行: 7条数据
debug代码断点调试: list.size()== 6 只有6条数据

在mybatis中有 6条数据
在mysql中有 7 条数据

问题一:是什么导致了 同样的sql语句得出的结果不一样?

我将注意力放在了sql 语句上, 仔细观摩sql语句 ,发现 有一行判断永远是0
语句如下:

-- 当common1 在 leve1 与 level2 之间的时候返回 value1 否则返回 0
case when a.common1 between b.level1 and b.level2 then b.value1 else 0 
end as pft2 

看起来没有问题, 但是这就是最大的问题.
在mysql中执行 有7 条数据 其中 6条 pft2 为0 , 一条 pft2 为100
在代码中 6条数据的 pft2 全部为 0

换而言之 就是在代码中 common1 不在 leve1 与 level2 之间 所以 pft2 永远为0 所以在 distinct 之下只有 6条数据

问题二: 为什么会如此?

问题的关键点在 表结构之上

create table tableA (
id int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
common1 decimal(16,2) NOT NULL DEFAULT '0.00' ,
........
);

create table tableB (
id int(11)  COMMENT 'ID',
level1 varchar(32) ,
level2 varchar(32),
.......,
value1 varchar(32),
......
)

以上的字段类型就是问题所在
在语句 中 使用 decimal between varchar and varchar . :

-- 当common1 在 leve1 与 level2 之间的时候返回 value1 否则返回 0
case when a.common1 between b.level1 and b.level2 then b.value1 else 0 
end as pft2 

如此我对于 当前语句在mybtis中挂掉一事 不在疑惑. 我现在疑惑的是在mysql数据库连接工具中可以执行 当前语句并且得出我想要的结果.

但是关于 mysql数据连接工具是如何处理的,在当前时刻下.我并不关心,我关心的是如何使得mybatis得出我想要的结果.

于是我想将 varchar转成 int double的数字类型 ,再进行 bewteen ,但是最后失败了.

博主的解决方式,是将这一段逻辑抽到代码中,规避掉这一段.

如果在这种情况下 有什么其他的解决方案,欢迎在下方留言

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值