zoukankan      html  css  js  c++  java
  • 检查字段是否为连续、跨段、连续的奇数列或偶数列

    oracle 自定义函数 检查字段是否为连续、跨段、连续的奇数列或偶数列
    --示例:Str(1,2,3,5,6,7), 返回Result(1-3周,5-7周);
    -- Str(1,3,5,7), 返回Result(1-7单周);
    -- Str(2,4,6,8), 返回Result(2-8双周);
    -- 其他返回Result(Str);

    `
    CREATE OR REPLACE FUNCTION "CHECKNUMSEQ1"(str IN VARCHAR2) RETURN VARCHAR2 IS
    p_num NUMBER DEFAULT 0; --计数器
    p_cnt NUMBER DEFAULT 1; --循环游标时的标识,相当于数组下标
    p_firstr VARCHAR2(5); --循环游标时保存第一行的值
    p_prer VARCHAR2(5); --循环游标时保存前一行的值
    p_result VARCHAR2(300);

    BEGIN

    SELECT COUNT(1) INTO p_num FROM TABLE(strsplitretarr(str, ','));

    IF p_num > 1 THEN
    FOR x IN (SELECT column_value AS v_num FROM TABLE(strsplitretarr(str, ',')) ORDER BY to_number(column_value)) LOOP
    --获得第一行
    IF p_cnt = 1 THEN
    p_firstr := x.v_num;
    END IF;
    --如果后一个数字减去前一个数字不等于1 ,就是不连续区域
    IF p_cnt > 1 AND to_number(x.v_num - p_prer) <> 1 THEN

        IF p_firstr = p_prer THEN
          p_result := p_result || p_firstr || ';';
        ELSE
          p_result := p_result || p_firstr || '-' || p_prer || ';';
        END IF;
    
        p_firstr := x.v_num;
      END IF;
      --获得最后一行
      IF p_cnt = p_num THEN
    
        IF to_number(x.v_num - p_prer) = 1 THEN
          p_result := p_result || p_firstr || '-' || x.v_num || ';';
        END IF;
    
        IF to_number(x.v_num - p_prer) <> 1 THEN
          IF p_firstr = p_prer THEN
            p_result := p_result || p_firstr || ';' || x.v_num || ';';
          ELSE
            p_result := p_result || x.v_num || ';';
          END IF;
        END IF;
      END IF;
      p_cnt  := p_cnt + 1;
      p_prer := x.v_num;
    END LOOP;
    
    SELECT rtrim(p_result, ';') INTO p_result FROM dual;
    

    ELSE
    p_result := str;
    END IF;

    --检测是否为奇数列或偶数列
    SELECT oddoreven(p_result) INTO p_result FROM dual;

    RETURN(p_result);
    EXCEPTION
    WHEN OTHERS THEN
    dbms_output.put_line(':程序运行出现内部错误,请联系管理员。' || dbms_utility.format_error_backtrace() || SQLCODE ||
    '---' || SQLERRM);
    END checknumseq1;
    `

    非常感谢某个同事的贡献

  • 相关阅读:
    2020牛客寒假算法基础集训营3
    2020牛客寒假算法基础集训营2
    2020牛客寒假算法基础集训营1
    Educational Codeforces Round 81 + Gym 102267
    博客迁移到自己的WordPress站上
    HDU 5172 GTY's gay friends 线段树 or Hash
    HDU 3436 Queue-jumpers Splay
    HDU 1890 Robotic Sort Splay
    POJ 3468 A Simple Problem with Integers Splay
    BZOJ 1503 郁闷的出纳员 Splay
  • 原文地址:https://www.cnblogs.com/heavenTang/p/13920921.html
Copyright © 2011-2022 走看看