在plsql中的以下数据中查找重叠
Posted
技术标签:
【中文标题】在plsql中的以下数据中查找重叠【英文标题】:Find overlapping in below data in plsql 【发布时间】:2020-11-25 17:00:23 【问题描述】:code Low High
A 0 99
E 0 99
T 0 99
A 100 **199**
E 100 **199**
T 100 **199**
A **199** 299
E **199** 299
T **199** 299
A 300 399
E 300 399
T 300 399
我想检查199之类的重叠。如果重叠,则在oracle中抛出异常。
【问题讨论】:
如果你想抛出异常,你必须使用 PLSQL。值 199 是给定值,还是需要在低/高列中查找重复项?即:如果 High 列中有 0,程序是否需要抛出异常? 您想对该异常做什么?您需要获取这些值还是仅仅告知存在? 【参考方案1】:您可以使用单个查询来完成,然后通过IF
条件处理它。
查询以确定是否应抛出异常:
SELECT MIN(CASE WHEN LAG_HIGH BETWEEN LOW AND HIGH THEN 'EXCEPTION'
ELSE 'NO EXCEPTION'
END) AS RESULT
FROM (SELECT T.*,
LAG(HIGH) OVER(PARTITION BY CODE ORDER BY LOW) AS LAG_HIGH
FROM YOUR_TABLE T);
如果您想要所有引发异常的代码,则可以使用以下查询:
SELECT DISTINCT CODES FROM
(SELECT CASE WHEN LAG_HIGH BETWEEN LOW AND HIGH THEN CODE
END AS CODES
FROM (SELECT T.*,
LAG(HIGH) OVER(PARTITION BY CODE ORDER BY LOW) AS LAG_HIGH
FROM YOUR_TABLE T))
WHERE CODES IS NOT NULL;
【讨论】:
嗨,Tejash 可以正常工作,但你能告诉我如何找到出现重叠的代码吗? 插入后可以在触发器中使用相同的逻辑吗? 在触发器中?请提出一个包含详细信息的新问题,以便我们为您提供正确的方案。【参考方案2】:可能会创建带有包含LAG()
分析函数查询的游标的过程
CREATE OR REPLACE PROCEDURE Pr_Check_Overlap( i_code tab.code%type ) IS
BEGIN
FOR c IN
(
SELECT t.*, LAG(high,1,high) OVER (PARTITION BY code ORDER BY code,low) AS previous_high
FROM tab t
WHERE code=i_code
ORDER BY Low
)
LOOP
DBMS_OUTPUT.PUT_LINE(c.code||' '||c.low||' '||c.high);
IF c.low = c.previous_high THEN
RAISE_APPLICATION_ERROR( -20101, 'First Met Overlapping Value is '||c.low );
END IF;
END LOOP;
END;
/
并以可互换的三个值调用其参数,如下所示
BEGIN
Pr_Check_Overlap('A'); -- 'E', 'T'
END;
【讨论】:
以上是关于在plsql中的以下数据中查找重叠的主要内容,如果未能解决你的问题,请参考以下文章