【问题标题】:Find overlapping in below data in plsql在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,程序是否需要抛出异常?
  • 您想对该异常做什么?您需要获取这些值还是仅仅告知存在?

标签: sql oracle oracle12c


【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多