如何找出不同条件下的最小值和最大值?

时间:2019-07-01 09:50:29

标签: sql oracle oracle11g max min

我想找出不同条件下的最小值和最大值。我只想在最小值为空时找出最大值。

请记住,lc_cont_yymm是变量,并且isMaxRequired,pc_cont_no,ld_Today是函数中的参数。 表员工-2125244行。 主索引打开-Cont_no,cont_yymm

SELECT MIN(cont_yymm) INTO lc_cont_yymm
       FROM Employees
       WHERE cont_no = pc_cont_no
       AND   ld_Today BETWEEN eff_date AND term_date;
    IF lc_cont_yymm IS NULL THEN
       IF isMaxRequired THEN
              SELECT MAX(cont_yymm) INTO lc_cont_yymm
                 FROM Employees
                    WHERE cont_no = pc_cont_no
                    AND ld_Today > term_date;
           IF lc_cont_yymm IS NULL THEN
                  RETURN '-2';
           END IF;
       ELSE
              RETURN '-2';
       END IF;
    END IF;
    RETURN lc_cont_yymm;

此查询在for..loops中重复调用会花费很多时间。如果最小值为空,则尝试更多时间,然后尝试找到最大值。我想以更好的方式进行优化。 请帮忙吗?

1 个答案:

答案 0 :(得分:0)

尝试将两个查询合并为一个

SELECT CASE WHEN min(cont_yymm) IS NOT NULL 
             AND max(sign(ld_Today - eff_date) * sign(ld_Today - term_date)) < 1 THEN 
                 min(cont_yymm)
       ELSE
         CASE WHEN max(sign(ld_Today - term_date)) THEN
                   max(cont_yymm)
       END 
  INTO lc_cont_yymm
  FROM Employees
 WHERE cont_no = pc_cont_no

一个查询一次解析一个成本。

P.S。为了能够对所有术语使用聚合,我使用了sign()函数而不是>运算符或between关键字。

因此,将您的代码块转换为

DECLARE
  isMaxRequired boolean := false; 
  lc_cont_yymm  pls_integer;
--the other variables
BEGIN
  -- some operations
 IF isMaxRequired THEN
  SELECT CASE WHEN min(cont_yymm) IS NOT NULL 
               AND max(sign(ld_Today - eff_date) * sign(ld_Today - term_date)) < 1 THEN 
                   min(cont_yymm)
         ELSE
           CASE WHEN max(sign(ld_Today - term_date)) THEN
                     max(cont_yymm)
         END 
    INTO lc_cont_yymm
    FROM Employees
   WHERE cont_no = pc_cont_no      
 ELSE
        RETURN '-2';
 END IF;
END;