下面的代码不工作,请告知。
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:
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
发布于 2018-12-13 17:02:54
假设a.type_id包含2、3、4等值。第一个case()返回字符串 (2,3)。它是一个单一的值,所以IN变成了一个相等测试。2不等于'(2,3)。因此,第一个代码不起作用。而第二个case()返回一个可以与a.type_id中的值匹配的值2。
“不管怎样,如果V_ID =3,那么它将返回所有可用的数据,但如果不是,它将返回(2,3)中包含a.type_id的数据。”
正如其他人评论的那样,这很容易用常规的布尔操作实现,根本不需要case():
SELECT *
FROM TBL_REASON_MAP A
WHERE V_ID = 3
or (V_ID != 3
and a.type_id IN (2,3));发布于 2018-12-13 17:15:46
到目前为止,我得到的解决方案如下:
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;发布于 2018-12-13 21:47:39
最简单的逻辑是:
WHERE ( V_ID = 3 OR a.type_id IN (2, 3) );不需要CASE表达式。
https://stackoverflow.com/questions/53758088
复制相似问题