MySQL WHERE条件过滤异常:筛选0却返回0和1分组结果
问题描述
执行以下简化查询(仅用于复现问题):
SELECT `Work_Activity_Excl` , count(`Work_Activity_Excl`) as `Count1` , sum(if(`Work_Activity_Excl` = 0 ,1 ,0)) as `Count2` FROM `kpi_2023_mtt_detail` WHERE `Work_Activity_Excl` = 0 group by `Work_Activity_Excl`;
WHERE子句已筛选Work_Activity_Excl=0的记录,但查询结果仍同时出现0和1的分组行。而Count2字段使用相同的Work_Activity_Excl=0判断逻辑却能正常统计。
视图kpi_2023_mtt_detail中Work_Activity_Excl字段的生成逻辑如下:
(case when (`b`.`Work_Activity` in ('Újrakábelezés','Self berendezés beüzemelés')) Then 1 else 0 end) as `Work_Activity_Excl`
使用环境为Windows下的MySQL 8.32服务器和Workbench 8.0.28。将视图替换为0和1的UNION集合时查询正常,需定位问题根源。
问题原因与解决办法
核心原因
视图中Work_Activity_Excl字段的实际类型为字符串,而非预期的数值类型。MySQL的CASE表达式会根据分支关联字段的类型自动推断返回类型:由于b.Work_Activity是字符串类型,CASE返回的1和0会被隐式转换为字符串'1'和'0'。
当在WHERE子句中用数值0与字符串类型字段比较时,MySQL的隐式转换逻辑受字符集/排序规则(如匈牙利语相关规则)影响,可能出现非预期匹配,导致本应被过滤的'1'记录被错误保留,最终GROUP BY出现两组结果。而Count2的IF函数内部比较逻辑更严格,因此能正常工作。
解决办法
显式将CASE表达式结果转换为数值类型,确保字段类型与查询逻辑一致:
- 方法一:通过加法运算强制转换
(case when (`b`.`Work_Activity` in ('Újrakábelezés','Self berendezés beüzemelés')) Then 1 else 0 end) + 0 as `Work_Activity_Excl`
- 方法二:使用CAST函数明确指定类型
CAST( case when (`b`.`Work_Activity` in ('Újrakábelezés','Self berendezés beüzemelés')) Then 1 else 0 end AS UNSIGNED ) as `Work_Activity_Excl`
修改视图字段定义后,原查询的WHERE过滤和GROUP BY分组将正常执行,仅返回Work_Activity_Excl=0的分组结果。
内容的提问来源于stack exchange,提问作者Tamas U.
相关产品推荐
相关产品推荐

