我正在尝试根据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 回答
由于
COL1 IN (COL1)
与true
相同,因此您可以像这样重写查询:通常,
CASE/WHEN/END
子句只能在SELECT
的"projection"部分中使用;你需要在WHERE
子句中使用"regular"布尔表达式 .您的
ELSE
包含一个返回多行的SELECT
.相反,您可以在测试IN之前测试NULL: