在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中的以下数据中查找重叠的主要内容,如果未能解决你的问题,请参考以下文章

plsql数据库查找完表直接在表上修改怎么弄

PLSQL:在 xml 中查找标签值并将其替换为标签名称以创建示例数据

在 pyspark 数据框中查找不重叠的窗口

在数据框中查找重叠范围并为其分配值

绘图区域中的图例重叠

使用 Linq C# 在 DataTable 中查找重叠的日期