在WHERE IN子句中使用CASE

时间:2013-02-20 13:29:47

标签: oracle case where-clause

我正在尝试根据IN参数制定WHERE子句。出于这个原因,我正在做一些在WHERE IN子句中使用CASE的实验。这是可行的:

SELECT * FROM TABLE1 WHERE COL1 IN (SELECT ID FROM TABLE2);

考虑我有一个名为P1的输入参数。这种类型不是必需的。如果P1的值为null,那么以下一个也可以正常工作:

SELECT * FROM TABLE1 WHERE COL1 IN (CASE P1 WHEN NULL THEN COL1 ELSE (SELECT ID FROM TABLE2));

但如果P1不是NULL,我会得到

  

ORA-01427:单行子查询返回多行

错误。

如果您想知道我为什么需要这个,请让我快速解释一下。存储过程将接受许多输入参数。其中一些将是用户定义的集合类型。并且所有参数都是DEFAULT NULL值可选的。所以我想检查参数是否为NULL,如果是这种情况,则将参数对应的列与自身进行比较(这意味着该列上没有过滤器),否则使用参数内的值过滤列。是我以某种方式尝试的方式吗?

2 个答案:

答案 0 :(得分:3)

您的ELSE包含一个返回多行的SELECT

相反,您可以在测试IN之前测试NULL:

SELECT * FROM TABLE1 WHERE (P1 IS NULL) OR (COL1 IN (SELECT ID FROM TABLE2));

答案 1 :(得分:1)

由于COL1 IN (COL1)true相同,您可以像这样重写您的查询:

SELECT *
FROM TABLE1
WHERE P1 IS NULL OR COL1 IN (SELECT ID FROM TABLE2);

通常,CASE/WHEN/END子句只能用于SELECT的“投影”部分;你需要在WHERE子句中使用“常规”布尔表达式。