当时的情况

时间:2018-12-13 08:51:38

标签: sql oracle

以下代码不起作用,请告知。

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;

下面没问题:

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

3 个答案:

答案 0 :(得分:1)

大概a.type_id包含诸如234等的值。第一个case()返回一个{strong>字符串 {1}}。它是单个值,因此IN成为相等性测试。 (2,3)不等于2。因此,第一个代码不起作用。而第二个'(2,3)返回单个值case(),该值可以与2中的值匹配。


  

“无论如何,如果V_ID = 3,它将返回所有可用数据,但如果不可用,它将返回(2,3)中带有a.type_id的数据。”

正如其他人所评论的那样,使用常规布尔运算很容易实现,而根本不需要a.type_id

case()

答案 1 :(得分:0)

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

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;

答案 2 :(得分:0)

最简单的逻辑是:

WHERE ( V_ID = 3 OR a.type_id IN (2, 3) );

不需要CASE表达式。