首页 文章

在WHERE IN子句中使用CASE

提问于
浏览
2

我正在尝试根据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 回答

  • 3

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

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

    通常, CASE/WHEN/END 子句只能在 SELECT 的"projection"部分中使用;你需要在 WHERE 子句中使用"regular"布尔表达式 .

  • 1

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

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

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

相关问题