以下代码不起作用,请告知。
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
答案 0 :(得分:1)
大概a.type_id
包含诸如2
,3
,4
等的值。第一个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
表达式。