2023 06 09 not like也有同样bug
-- 这样查,因为config_basic_station的MESSAGERECORD 有为null的查不出值
SELECT * from xhq_basic_site xbs
WHERE MESSAGERECORD not in (SELECT cbs.MESSAGERECORD FROM config_basic_station cbs)
-- 正确的应该这样查
SELECT * from xhq_basic_site xbs
WHERE MESSAGERECORD not in (
SELECT cbs.MESSAGERECORD FROM config_basic_station cbs
WHERE cbs.MESSAGERECORD is not null
)
mysql中关于 like ,not like 的用法时不能显示空值的数据(空值不参与判断,直接过滤空值)
- https://www.likecs.com/show-308408575.html
一般在项目中用法是(这种没办法显示空值的数据):
select * from 表 where 字段 like %aaa%;
解决空值不显示(除了显示的数据外,空值数据也可以显示):
select * from 表 where 字段 like %aaa% or 字段 is null;
注意:其中 字段 is null 必须要用is null 不能写成 字段=null
问题出现
- 使用MyBatisPlus查询
QueryWrapper<ConfigBasicStation> terminalIdQr = new QueryWrapper<>();
terminalIdQr.eq("TERMINAL_ID", stationTerminalId);
terminalIdQr.eq("ROUTE_ID", basicStation.getRouteId());
//不包含 abc的。第一版我是这样写的。但是null的不会查出来。
terminalIdQr.notLike("UNREAL_TERMINAL_ID", "abc");
List<ConfigBasicStation> terminalStations = stationMapper.selectList(terminalIdQr);
- 第一条数据,UNREAL_TERMINAL_ID = null
00000173492 120494 金葵路金槐路 10220 1 28 1 10000008 1 0 121.636719 121.636719 pdb0528 -1717986919 06:34 23:34 0 0
00000250296 129025 金葵路金槐路 10220 1 19 1 10000008 1 0 121.636719 121.636719 pdb0528 0 06:28 23:28 0 0 abc173492
- 执行的SQL为:
SELECT
*
FROM
config_basic_station
WHERE
TERMINAL_ID = '10000008'
AND ROUTE_ID = 10220
AND UNREAL_TERMINAL_ID NOT LIKE '%abc%'
运行后,发现问题。 第一条数据,UNREAL_TERMINAL_ID = null 的数据,查询不出来。
查询后发现:not like 的用法时不能显示空值的数据(空值不参与判断,直接过滤空值)
解决问题
terminalIdQr.and(q ->
q.notLike("UNREAL_TERMINAL_ID", "sql")
.or()
.isNull("UNREAL_TERMINAL_ID")
);
- SQL执行如下
SELECT
*
FROM
config_basic_station
WHERE
TERMINAL_ID = '10000008'
AND ROUTE_ID = 10220
AND (
UNREAL_TERMINAL_ID NOT LIKE '%abc'
OR UNREAL_TERMINAL_ID IS NULL
)