MySQL WHERE子句CASE用法报错排查:按条件匹配重复手机号
我来帮你排查这个MySQL查询的问题~你的语句逻辑出错主要是CASE表达式的写法偏离了预期,咱们一步步理清楚:
首先说原语句的核心问题:
- 你原本想根据外部传入的
$one_or_two变量来切换匹配first_phone还是sec_phone,但原CASE里却在判断表中的one_or_two字段等于变量,完全搞错了判断对象! - 每个WHEN里重复写
one_or_two=$one_or_two是冗余的,变量值是固定的,不需要反复判断。 - ELSE分支写
1=1会导致当变量不是1或2时,所有满足s.id!=t.id和t.id=4327的记录都被统计,这大概率不是你想要的结果。
修正方案一:简化CASE表达式
SELECT count(t.id) as sayi FROM student as t INNER JOIN student s ON s.id != t.id WHERE CASE $one_or_two WHEN 1 THEN s.first_phone = t.first_phone WHEN 2 THEN s.sec_phone = t.sec_phone ELSE FALSE -- 变量不是1/2时不匹配任何记录,可按需调整 END AND t.id = 4327;
修正方案二:用OR组合条件(可读性更强,推荐)
这种写法逻辑更直观,一眼就能看懂不同变量值对应的匹配规则:
SELECT count(t.id) as sayi FROM student as t INNER JOIN student s ON s.id != t.id WHERE t.id = 4327 AND ( ($one_or_two = 1 AND s.first_phone = t.first_phone) OR ($one_or_two = 2 AND s.sec_phone = t.sec_phone) );
额外提醒
- 一定要确保
$one_or_two是安全传入的,比如用预处理语句,避免SQL注入风险。 - 如果
first_phone或sec_phone可能存在NULL值,普通的=比较会忽略NULL的重复情况,这时可以用MySQL的NULL安全比较运算符<=>,比如改成s.first_phone <=> t.first_phone。
内容的提问来源于stack exchange,提问作者Tota1907
相关产品推荐
相关产品推荐

