2

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

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

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

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

但是如果 P1 不是 NULL 我得到

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

错误。

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

4

2 回答 2

3

ELSE包含SELECT返回多行的 a。

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

SELECT * FROM TABLE1 WHERE (P1 IS NULL) OR (COL1 IN (SELECT ID FROM TABLE2));
于 2013-02-20T13:31:02.930 回答
2

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

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

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

于 2013-02-20T13:33:18.443 回答