我正在尝试根据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,如果是这种情况,则将参数对应的列与自身进行比较(这意味着该列上没有过滤器),否则使用参数内的值过滤列。是我以某种方式尝试的方式吗?
答案 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
子句中使用“常规”布尔表达式。