SQL中CASE语句内IN子句结果与预期相反的原因分析
问题原因与修正方案
你的SQL语句里的CASE表达式使用错误,导致逻辑完全反转。
错误根源
你用了简单CASE表达式的语法结构(CASE 列名 WHEN ...),但在WHEN后面写了一个条件判断id_Proof in('Passport','PAN')。这种写法会把id_Proof的值和这个条件的布尔结果(TRUE/FALSE)做等值比较,而字符串和布尔值的隐式转换逻辑会导致:
- 当
id_Proof是'Passport'或'PAN'时,条件id_Proof in(...)结果为TRUE,此时id_Proof(字符串)和TRUE(布尔值)无法匹配,所以会走到ELSE分支返回原id_Proof; - 当
id_Proof是其他值时,条件结果为FALSE,同样无法匹配,最终出现和预期相反的结果。
正确写法
有两种修正方式:
方式1:使用搜索CASE表达式(推荐,逻辑更清晰)
去掉CASE后面的id_Proof,直接在每个WHEN里写条件:
select AccountNO,id_Proof, CASE when id_Proof in('Passport','PAN') then 'P' else id_Proof end as abc from customer2;
方式2:修正简单CASE表达式的写法
如果坚持用简单CASE,需要把每个匹配值单独写WHEN:
select AccountNO,id_Proof, CASE id_Proof when 'Passport' then 'P' when 'PAN' then 'P' else id_Proof end as abc from customer2;
这两种写法都能实现你的预期:当id_Proof是'Passport'或'PAN'时返回'P',否则返回原字段值。
内容的提问来源于stack exchange,提问作者kiran borhade
相关产品推荐
相关产品推荐

