MySQL 8.0.40中CASE WHEN生成的计算列在WHERE子句过滤时异常的问题咨询
MySQL 8.0.40中CASE WHEN生成的计算列在WHERE子句过滤时异常的问题咨询
嘿,我来帮你捋捋这个问题——你遇到的其实是MySQL里一个超容易踩的小坑,咱们一步步说清楚:
首先,先确认下你的核心操作:你用两个CTE拉取数据,通过CASE WHEN生成了2022_is_greater这个计算列(当2022年1月的数值大于2021年1月时填1,否则填0),但在WHERE子句里过滤这个列时,出现了三个奇怪的现象:
- 写
WHERE '2022_is_greater' = 1时,本该返回18行结果,却只得到0行 - 写
WHERE '2022_is_greater' > x(x是≥0的任意整数)时,反而返回了全部18行 - 还收到错误提示:
Truncated incorrect DOUBLE value: '2022_is_greater'
问题根源:用错了引号!
在MySQL的语法里,单引号'是用来包裹字符串常量的,不是列名。当你写'2022_is_greater'的时候,MySQL会把它当成一个固定的字符串,而不是你刚创建的计算列。
咱们逐一拆解异常原因:
- 为什么
'2022_is_greater' = 1返回0行?
MySQL在比较字符串和数字时,会尝试把字符串转成数字。你的字符串'2022_is_greater'开头没有有效数字,所以转换后的值是0,0和1不相等,自然没有匹配的行。 - 为什么
'2022_is_greater' > x返回所有行?
同样的,字符串转成数字0后,你以为是在和计算列的值比较,其实一直在和一个固定的常量做无效对比,这个逻辑根本没关联到你的行数据,才出现了不符合预期的结果。 - 为什么会出现截断错误?
这个错误就是MySQL尝试把字符串'2022_is_greater'转成数字时触发的,因为字符串里的非数字部分会被截断,MySQL就抛出了这个警告/错误。
解决方法:正确引用列名
把单引号去掉直接用列名就行,如果你的列名包含空格、关键字这类特殊字符,就用反引号`包裹(你的列名是合法的,不用反引号也可以):
WITH cte1 AS (...), cte2 AS (...) SELECT *, CASE WHEN jan2022 > jan2021 THEN 1 ELSE 0 END AS `2022_is_greater` FROM cte1 JOIN cte2 ON Pr_2021 = Pr_2022 WHERE `2022_is_greater` = 1; -- 这里用列名,不是字符串
这样修改后,MySQL就会正确识别你生成的计算列,过滤出值为1的18行数据,那个截断错误也会消失啦。
备注:内容来源于stack exchange,提问作者MarkS
相关产品推荐
相关产品推荐

