冷面閻羅

          低調(diào)做人&&高調(diào)做事
          隨筆 - 208, 文章 - 3, 評論 - 593, 引用 - 0
          數(shù)據(jù)加載中……

          多重子查詢提取每次子查詢的SQL語句

                  之前用的oracle大型數(shù)據(jù)庫,寫的sql都是依據(jù)oracle的。移動端部分用的不能是oracle數(shù)據(jù)庫,只能采用小型數(shù)據(jù)庫,現(xiàn)場采用db2。
                  db2大小只能論k為單位,很多基本的sql語法都不支持,尤其多重子查詢就不支持,做試驗報告的閥值就必須得用這個子查詢,沒有部分只好將多重子查詢提出sql,單獨執(zhí)行。
                  提取多重子查詢的方法倒是不復(fù)雜,就是對sql語句循環(huán)處理,判斷是否含有多個select關(guān)鍵字,如果有從字符串最后一個select處理,截取sql語句,執(zhí)行,然后將查詢的結(jié)果替換原先的sql語句,直到循環(huán)判斷sql語句中只有一個select關(guān)鍵字。
                   關(guān)鍵部分的代碼:
                  int lastSelectNo = 0;
                  
          int size = 0;
                  
                  
          if (sqlString.split("select").length - 1 > 0)
                      size 
          = sqlString.split("select").length - 1;
                  
          else if (sqlString.split("SELECT").length - 1 > 0)
                      size 
          = sqlString.split("SELECT").length - 1;

                  String[] sql 
          = new String[size];

                  
          while (isHaveTwoSelect(sqlString))
                  
          {
                      lastSelectNo 
          = sqlString.lastIndexOf("select");
                      
          if (lastSelectNo == 0)
                          lastSelectNo 
          = sqlString.lastIndexOf("SELECT");

                      
          char beforeLast = sqlString.charAt(lastSelectNo - 1);
                      
          if (beforeLast == '(')
                      
          {
                          
          int k = 5;
                          String string 
          = sqlString.substring(lastSelectNo).substring(0, k);
                          
          while (!IsMatching(string))
                          
          {
                              k
          ++;
                              string 
          = sqlString.substring(lastSelectNo).substring(0, k);
                          }

                          sql[size 
          - 1= string.substring(0, k - 1);
                          sqlString 
          = replace(sqlString, sql[size - 1].toString(), "sql[" + (size - 1+ "]");
                          size
          --;
                      }
          //if(befor            
                  }

                  sql[
          0= sqlString;

                問題是:對于select關(guān)鍵字的處理,目前只知道全是小寫select或是全是大寫SELECT,實際中select關(guān)鍵字這個不考慮大小寫限制,我這邊還尚未進(jìn)行校驗,一是比較麻煩二是尚未發(fā)現(xiàn)好的方法,目前就是對select關(guān)鍵字依次判斷是否是s e l e c t幾個字符 ,不考慮大小寫。
               大家如果有好的處理select關(guān)鍵字方法,歡迎得道你的支持。

          posted on 2008-04-22 20:58 冷面閻羅 閱讀(2112) 評論(2)  編輯  收藏 所屬分類: java

          評論

          # re: 多重子查詢提取每次子查詢的SQL語句  回復(fù)  更多評論   

          上午又對核心算法優(yōu)化一下,可以處理多個并列的SQL。具體算法如下:
          while (isHaveTwoSelect(sqlString)) 

          lastSelectNo 
          = sqlString.lastIndexOf("select"); 
          if (lastSelectNo == 0
          lastSelectNo 
          = sqlString.lastIndexOf("SELECT"); 

          int k = 5
          String string 
          = sqlString.substring(lastSelectNo).substring(0, k); 
          while (!IsMatching(string)) 

          k
          ++
          string 
          = sqlString.substring(lastSelectNo).substring(0, k); 
          }
           
          sql[size 
          - 1= string.substring(0, k - 1); 
          sqlString 
          = sqlString.substring(0, lastSelectNo) + "sql[" + (size - 1+ "]" + sqlString.substring(lastSelectNo + k - 1, sqlString.length()); 
          size
          --
          }
           
          sql[
          0= sqlString; 
          2008-04-23 12:40 | 冷面閻羅

          # re: 多重子查詢提取每次子查詢的SQL語句  回復(fù)  更多評論   

          盡量不要在循環(huán)里寫sql語句,很容易造成不良危險
          2008-04-25 14:44 | 懶人
          主站蜘蛛池模板: 溆浦县| 石屏县| 包头市| 九江市| 南投市| 肇州县| 荆州市| 新巴尔虎左旗| 双峰县| 红河县| 静海县| 武陟县| 桂阳县| 宜阳县| 镇原县| 治多县| 鄂尔多斯市| 揭阳市| 沙坪坝区| 潞西市| 铅山县| 阿拉善左旗| 磐安县| 和田市| 宁阳县| 天津市| 三穗县| 松溪县| 保亭| 莲花县| 阆中市| 安图县| 桂平市| 化隆| 绥中县| 郑州市| 随州市| 宁南县| 沾益县| 昌黎县| 淮安市|