2013-02-20 76 views
2

我试图根据IN参数来制定WHERE子句。出于这个原因,我正在做一些关于在WHERE IN子句中使用CASE的实验。这是什么工作正常:在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,如果是这种情况,那么比较与该参数相对应的列对其本身(这意味着该列没有过滤器),否则使用参数内的值(s)过滤列。我试图以某种方式尝试吗?

回答

1

由于COL1 IN (COL1)是一样的true,你可以重写你的查询是这样的:

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

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

+0

太棒了。非常感谢。 – 2013-02-20 14:01:31

3

您的ELSE包含返回多行的SELECT

相反,你可以测试之前测试NULL:

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