我经常遇到这样的情况:我有一些非常复杂的操作,有时候需要通过案例进一步处理。
如果我按常规方式使用它,它看起来很丑陋并且有很多冗余代码。
让我们说。
select
case when (1+1) > 0 then (1+1) else null end
from dual
这是我目前使用的案例。
让我们假设(1 + 1)是我的复杂操作,可能需要几行代码。如果它与WHEN子句匹配,那么我只需要从子句中获得该返回值,而不必在THEN部分重复自己。 因为这将导致相当丑陋和夸张的陈述。
有没有办法在声明中只有一次使用(1 + 1)部分来编写它?
答案 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