在 plsql 中查找以下数据中的重叠

Find overlapping in below data in plsql

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中抛出异常。

可能会创建一个过程,其游标包含具有 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;

您可以使用单个查询来完成,然后通过 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;