如何修复并简化出现#1582错误的MySQL SQL查询语句?
问题原因
MySQL原生ISNULL函数仅支持1个入参,作用是判断输入值是否为NULL并返回1/0,无法实现空值替换的需求,因此触发参数数量不匹配的报错。
同时原有字段 IN (NULL,1)写法无效,IN运算符无法匹配NULL值,无法正确筛选出值为NULL的条目。
修复后完整SQL
SELECT * FROM `table` WHERE (M IS NULL OR M = 1) AND (T IS NULL OR T = 1) AND (J IS NULL OR J = 1) AND (B IS NULL OR B = 1) AND (IFNULL(M,0) + IFNULL(T,0) + IFNULL(J,0) + IFNULL(B,0)) < 4 ORDER BY (IFNULL(M,0) + IFNULL(T,0) + IFNULL(J,0) + IFNULL(B,0)) DESC
简化优化方案
结合筛选后四个字段仅存在NULL/1两种取值的特性,可将求和小于4的判断替换为直接排除四个字段全为1的场景,减少一次求和计算,逻辑和原需求完全一致:
SELECT * FROM `table` WHERE (M IS NULL OR M = 1) AND (T IS NULL OR T = 1) AND (J IS NULL OR J = 1) AND (B IS NULL OR B = 1) AND NOT (M = 1 AND T = 1 AND J = 1 AND B = 1) ORDER BY (IFNULL(M,0) + IFNULL(T,0) + IFNULL(J,0) + IFNULL(B,0)) DESC
逻辑说明:筛选后仅当四个字段全为1时,求和结果等于4,直接排除该场景即可达到原需求的过滤效果,无需额外执行求和计算。
内容的提问来源于stack exchange,提问作者user3916429
相关产品推荐
相关产品推荐

