Java實現 Oracle decode函數 轉換為 MySQL 可用的 case when


  • 具體實現思路

首先要確認sql中沒有包含decode的字符串或者字段 有的話可以自行替代后再做操作
先獲取 decode的位置 然后截取出 decode括號內的部分 通過計算左右括號的數量即可截取出來
然后再將 decode括號內的部分分為4段 然后拼接回原來的SQL 重復循環執行即可

    private static String decodeTransformToCaseWhen(String sql) {
        /**
         * 將decode的各部分分分別存儲  最后拼接
         */
        List<String> strings = new ArrayList<>();
        StringBuilder result = new StringBuilder(" ( case " + strings.get(0) + " when ");
        int start = sql.indexOf("decode") + 6;
        int left = 0, right = 0, end = 0;
        /**
         * 獲取當前第一個decode 出現的位置和結束的位置  start是decode之后左括號 ( 起始的位置  ende是 最右邊括號 ) 的位置
         */
        for (int i = sql.indexOf("decode") + 6; i < sql.length(); i++) {
            if (sql.charAt(i) == '(') left++;
            if (sql.charAt(i) == ')') right++;
            if (right != 0 && left == right) {
                end = i;
                break;
            }
        }
        /**
         *  截取出decode括號內的部分
         */
        String subStr = sql.substring(sql.indexOf("decode") + 7, end);
        left = 0;
        right = 0;
        int end2 = 0;//每一個,切割位置記錄   為下一次切割的起始位置
        for (int i = 0; i < subStr.length(); i++) {
            if (subStr.charAt(i) == '(') left++;
            if (subStr.charAt(i) == ')') right++;
            /**
             * i == subStr.length() - 1時 直接截取到最后即可
             */
            if ((subStr.charAt(i) == ',' && left == right) || i == subStr.length() - 1) {
                left = 0;
                right = 0;
                if (i == subStr.length() - 1)
                    strings.add(subStr.substring(end2));
                else
                    strings.add(subStr.substring(end2, i));
                end2 = i + 1;
            }
        }
        result.append(" ( case ").append(strings.get(0)).append(" when ");
        for (int i = 1; i < strings.size() - 1; i++) {
            if (i % 2 == 1)
                result.append(strings.get(i)).append(" ");
            else if (i == strings.size() - 2) {
                result.append(" then ").append(strings.get(i)).append(" else ");
            } else {
                result.append(" then ").append(strings.get(i)).append(" when ");
            }
        }
        result.append(strings.get(strings.size() - 1)).append(" end ) ");
        return sql.substring(0, start - 6) + result + sql.substring(end + 1);
    }
  • 調用函數及測試用例
    //測試用例
    public static void main(String[] args) {
        String sql = "select decode(substr(TIME_, 5, 6), 2, 777,\n" +
                "              decode(substr(nvl(B103B,0), 1, 3), 14, 23, (nvl(B103B, 0) - substr(TIME_, 0, 3)) / substr(TIME_, 4, 6))) k,\n" +
                "       B103B\n" +
                "from user_info\n" +
                "where TIME_ = '202004'";
        decodeToCaseWhen(sql);
    }
    //循環執行  把全部decode函數都替換
    public static String decodeToCaseWhen(String sql) {
        String ss = sql.replaceAll("nvl", "isnull")
                .replaceAll("NVL", "isnull")
                .replaceAll("DECODE", "decode");
        int s = ss.split("decode").length - 1;
        for (int i = 0; i < s; i++) {
            ss = decodeTransformToCaseWhen(ss);
        }
        return ss;
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM