如何找出不同where条件下的最小值和最大值?
How to find out the min and max value on different where condition?
我想找出不同 where 条件下的最小值和最大值。我只想在最小值为空时找出最大值。
记住 lc_cont_yymm 是变量,isMaxRequired、pc_cont_no、ld_Today 是函数中的参数。
Table 员工 - 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 中重复调用时,此查询会花费很多时间。甚至更多的时间,当最小值为 null 时并尝试找到最大值。我想以更好的方式进行优化。
请帮忙解决这个问题?
尝试将两个查询合并为一个
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;
我想找出不同 where 条件下的最小值和最大值。我只想在最小值为空时找出最大值。
记住 lc_cont_yymm 是变量,isMaxRequired、pc_cont_no、ld_Today 是函数中的参数。 Table 员工 - 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 中重复调用时,此查询会花费很多时间。甚至更多的时间,当最小值为 null 时并尝试找到最大值。我想以更好的方式进行优化。 请帮忙解决这个问题?
尝试将两个查询合并为一个
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;