【问题标题】:ERROR : single row subquery returns how many rows when using case statement错误:使用 case 语句时,单行子查询返回多少行
【发布时间】:2021-04-11 19:22:04
【问题描述】:

我有以下疑问:

SELECT * FROM My_table
WHERE type_id IN 
CASE WHEN :P1_type IS NULL THEN (SELECT id FROM type)
ELSE (:P1_type)
END

当我尝试运行它时,我得到了这个错误: ORA-01427: Subquery returns more than one row 我认为我的查询不正确所以我尝试了这个

SELECT * FROM My_table
WHERE type_id IN (SELECT id FROM type)

这一次它运行得很好,这意味着(在我看来)case 语句不能正常处理返回多于一行的查询。那么有没有解决这个问题的方法,或者我必须找到 CASE 语句以外的东西才能使用。 我也想使用 PL/SQL 但我不能,因为此查询将在 APEX 应用程序中使用,并且在这种情况下 PL\SQL 不是一个选项。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    CASE 表达式(是的,表达式,不是语句)不是这样工作的。它们只能用于标量值,不能用于集合。

    但您不需要CASE,只需使用布尔运算符即可。

    SELECT *
           FROM my_table
           WHERE :p1_type IS NULL
                 AND type_id IN (SELECT id
                                        FROM type)
                  OR :p1_type IS NOT NULL
                     AND type_id = :p1_type;
    

    【讨论】:

    • 您确定它会正常工作吗?当我看到OR 并且没有括号时,我怀疑返回的不需要的值太多了。
    • @Littlefoot: AND 优先于OR,因此不需要括号。
    • 好吧,那就更好了。
    【解决方案2】:

    NULLNOT NULL 情况可以通过使用NVL2() 函数来组合,例如

    SELECT *
      FROM my_table
     WHERE type_id IN ( SELECT NVL2(:p1_type,:p1_type,id) FROM type )
    

    LEFT JOIN 也可以与NVL2() 一起使用,例如

    SELECT DISTINCT m.*
      FROM my_table m
      LEFT JOIN type 
        ON type_id = NVL2(:p1_type,:p1_type,id)
     WHERE id IS NOT NULL
    

    【讨论】:

      【解决方案3】:

      我建议使用EXISTS:

      SELECT t.*
      FROM My_table t
      WHERE t.type_id = :P1_type OR
            (:P1_type IS NULL AND
             EXISTS (SELECT 1 FROM type WHERE t.id = type.id)
            );
      

      您的版本不起作用,因为CASE 是 SQL 中的表达式,它返回单个值,而不是列表。因此,将它与IN 一起使用是没有意义的。

      注意:在我看来,一个名为 type_id 的东西不会引用 type.id。如果是这种情况,那么NULL 似乎意味着“所有行”并且不需要子查询:

      SELECT t.*
      FROM My_table t
      WHERE t.type_id = :P1_type OR :P1_type IS NULL;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多