oracle如何通过复杂的操作缩短案例

时间:2016-08-31 09:59:20

标签: sql oracle case

我经常遇到这样的情况:我有一些非常复杂的操作,有时候需要通过案例进一步处理。

如果我按常规方式使用它,它看起来很丑陋并且有很多冗余代码。

让我们说。

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

这是我目前使用的案例。

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

有没有办法在声明中只有一次使用(1 + 1)部分来编写它?

3 个答案:

答案 0 :(得分:2)

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

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

greatest()将返回0代表0或NULL值(相当于case中的条件。nullif()返回NULL代表0或负数值。

答案 1 :(得分:1)

将代码移动到一个函数。你甚至可以让函数return 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;

答案 2 :(得分:1)

您可以将其包装在公用表表达式中:

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