oracle如何缩短复杂操作的案例
Posted
技术标签:
【中文标题】oracle如何缩短复杂操作的案例【英文标题】:oracle how to shorten case with complex operation 【发布时间】: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) 部分?
【问题讨论】:
【参考方案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 对不起,我的错……确实有效。以上是关于oracle如何缩短复杂操作的案例的主要内容,如果未能解决你的问题,请参考以下文章