IN 子句在 sql 中的 CASE 语句中作用相反

问题描述 投票:0回答:1

有 customer2 表 enter image description here

尝试执行以下命令

select AccountNO,id_Proof,
       CASE id_Proof
        when id_Proof in('Passport','PAN') then 'P'
        else id_Proof
       end as abc  
from customer2;

它的作用相反

enter image description here

请说明为什么 IN 子句在 case 语句中得到相反的结果

sql mysql case in-clause
1个回答
0
投票

您在下一个语法变体中使用 CASE 运算符

CASE value WHEN compare_value THEN result [WHEN compare_value THEN result ...] [ELSE result] END

因此,在

when id_Proof in('Passport','PAN') then 'P'
中,表达式
id_Proof in('Passport','PAN')
被视为 compare_value

取决于当前

id_Proof
,它会产生 1、0 或 NULL。

然后将

id_Proof
与这个1、0或NULL进行比较。

如果值为 1,则

id_Proof
为 'Passport' 或 'PAN',比较结果为 FALSE,不使用该分支中的 result。如果值为 0,则
id_Proof
的字符串类型值将转换为数字数据类型,如果该值没有数字前缀,则生成 0,并且比较结果为 TRUE,则不使用此分支中的结果(如果值从数字开始,然后转换产生非零值,比较产生 FALSE)。如果值为 NULL,则任何列值都会生成 FALSE。

最后几乎任何值都会产生看起来像恢复的结果。

您必须使用 CASE 运算符的第二种形式:

CASE WHEN id_Proof IN ('Passport','PAN') ...

© www.soinside.com 2019 - 2024. All rights reserved.