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如何缩短复杂操作的案例的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL 中的复杂案例语句

AngularJS基于MVC的复杂操作案例

如何以复杂的方式使用案例

案例分析丨H&M用设计冲刺将App研发周期缩短为6个月

北亚案例:oracle数据库误删除数据的恢复方法

.NET MVC 模态表单提交