首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >case when then IN

case when then IN
EN

Stack Overflow用户
提问于 2018-12-13 16:51:38
回答 3查看 84关注 0票数 0

下面的代码不工作,请告知。

代码语言:javascript
复制
SELECT *
 FROM TBL_REASON_MAP A
WHERE case when V_ID = 3 then 'A' else to_char(a.type_id) end IN
      case when V_ID = 3 then 'A' else '(2,3)' end;

下面是OK:

代码语言:javascript
复制
SELECT *
  FROM TBL_REASON_MAP A
 WHERE case when  V_ID = 3 then 'A' else to_char(a.type_id) end IN
       case when  V_ID = 3 then 'A' else '2' end;

注意: V_ID是一个在plsql块中传递一个值的变量。如果V_ID =3,那么它将返回所有可用的数据,但如果不是,它将只返回(2,3)中包含a.type_id的数据。

例如V_ID =4

enter image description here

EN

回答 3

Stack Overflow用户

发布于 2018-12-13 17:02:54

假设a.type_id包含234等值。第一个case()返回字符串 (2,3)。它是一个单一的值,所以IN变成了一个相等测试。2不等于'(2,3)。因此,第一个代码不起作用。而第二个case()返回一个可以与a.type_id中的值匹配的值2

“不管怎样,如果V_ID =3,那么它将返回所有可用的数据,但如果不是,它将返回(2,3)中包含a.type_id的数据。”

正如其他人评论的那样,这很容易用常规的布尔操作实现,根本不需要case()

代码语言:javascript
复制
SELECT *
 FROM TBL_REASON_MAP A
WHERE V_ID = 3 
or (V_ID != 3 
    and a.type_id  IN (2,3));
票数 1
EN

Stack Overflow用户

发布于 2018-12-13 17:15:46

到目前为止,我得到的解决方案如下:

代码语言:javascript
复制
Declare

    V_ID number;

begin

    V_ID := 4;

    SELECT *
      FROM TBL_REASON_MAP A
     WHERE case when V_ID = 3 then 'A' else to_char(a.type_id) end >=
           case when V_ID = 3 then 'A' else '2' end
       and case when V_ID = 3 then 'A' else to_char(a.type_id) end !=
           case when V_ID = 3 then 'A' else '0' end;

END;
票数 0
EN

Stack Overflow用户

发布于 2018-12-13 21:47:39

最简单的逻辑是:

代码语言:javascript
复制
WHERE ( V_ID = 3 OR a.type_id IN (2, 3) );

不需要CASE表达式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53758088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档