前情提要:
一个简单的条件: 让 表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 ,但是最后失败了.
博主的解决方式,是将这一段逻辑抽到代码中,规避掉这一段.
如果在这种情况下 有什么其他的解决方案,欢迎在下方留言