【问题标题】:oracle how to shorten case with complex operationoracle如何缩短复杂操作的案例
【发布时间】:2016-08-31 09:59:19
【问题描述】:

我经常遇到这样的情况,我有相当复杂的操作,有时需要进一步处理。

如果我按照通常的方式使用它,它看起来很丑,而且里面有很多冗余代码。

让我们说。

select 
    case when (1+1) > 0  then (1+1) else null end 
from dual

这是我目前使用的 case。

假设 (1+1) 是我的复杂操作,可能需要几行代码。如果它与 WHEN 子句匹配,那么我只需要该子句的返回值,而不必在 THEN 部分重复自己。 因为那会导致非常丑陋和夸张的陈述。

有没有办法在语句中只包含一次 (1+1) 部分?

【问题讨论】:

    标签: sql oracle case


    【解决方案1】:

    虽然我通常更喜欢在 CTE 或子查询中执行此类工作,但有时这会使查询更加复杂。这是一个“更简单”的方法:

    select nullif(greatest(1 + 1, 0), 0)
    from dual;
    

    greatest() 将为 0 或 NULL 值返回 0(等效于 case 中的条件。nullif() 为 0 或负值返回 NULL

    【讨论】:

    • 好的,这足以解决我目前的问题。这就是我所希望的那种方法。所以我想这都是关于功能组合的知识来满足需要的。谢谢先生
    【解决方案2】:

    将代码移动到函数中。您甚至可以让函数返回 null 以完全消除 case 语句!

    create or replace function complex_code
    return number
    is
      l_return number;
    begin
      ... complex calculations ...
      ... more complex processing ...
      ... assign result of complex processing to l_number ...
    
      if l_number > 0
      then
        return l_number;
      else
        return null;
      end if;
    end complex_code;
    

    在您的查询中:

    select complex_code
    from dual;
    

    【讨论】:

    • 这将是一种方法,但我想我必须在我的结构上做很多工作或工作,我希望有更直接的解决方案
    【解决方案3】:

    您可以将其包装在一个通用的表表达式中:

    with t1 as (
      select 1+1 as complex_operation
      from ...
    )
    select case 
             when complex_operation > 0 then complex_operation 
             else null 
           end 
    from t1
    

    【讨论】:

    • 据我所知,我无法从女巫声明中的声明中访问表格吗?
    • @ZSchneidi:您可以将WITH 语句中所需的所有列公开给外部查询
    • @a_horse_with_no_name 对不起,我的错……确实有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    相关资源
    最近更新 更多