多重子查詢提取每次子查詢的SQL語句
之前用的oracle大型數據庫,寫的sql都是依據oracle的。移動端部分用的不能是oracle數據庫,只能采用小型數據庫,現場采用db2。
db2大小只能論k為單位,很多基本的sql語法都不支持,尤其多重子查詢就不支持,做試驗報告的閥值就必須得用這個子查詢,沒有部分只好將多重子查詢提出sql,單獨執行。
提取多重子查詢的方法倒是不復雜,就是對sql語句循環處理,判斷是否含有多個select關鍵字,如果有從字符串最后一個select處理,截取sql語句,執行,然后將查詢的結果替換原先的sql語句,直到循環判斷sql語句中只有一個select關鍵字。
關鍵部分的代碼:
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關鍵字的處理,目前只知道全是小寫select或是全是大寫SELECT,實際中select關鍵字這個不考慮大小寫限制,我這邊還尚未進行校驗,一是比較麻煩二是尚未發現好的方法,目前就是對select關鍵字依次判斷是否是s e l e c t幾個字符 ,不考慮大小寫。
大家如果有好的處理select關鍵字方法,歡迎得道你的支持。
db2大小只能論k為單位,很多基本的sql語法都不支持,尤其多重子查詢就不支持,做試驗報告的閥值就必須得用這個子查詢,沒有部分只好將多重子查詢提出sql,單獨執行。
提取多重子查詢的方法倒是不復雜,就是對sql語句循環處理,判斷是否含有多個select關鍵字,如果有從字符串最后一個select處理,截取sql語句,執行,然后將查詢的結果替換原先的sql語句,直到循環判斷sql語句中只有一個select關鍵字。
關鍵部分的代碼:
































問題是:對于select關鍵字的處理,目前只知道全是小寫select或是全是大寫SELECT,實際中select關鍵字這個不考慮大小寫限制,我這邊還尚未進行校驗,一是比較麻煩二是尚未發現好的方法,目前就是對select關鍵字依次判斷是否是s e l e c t幾個字符 ,不考慮大小寫。
大家如果有好的處理select關鍵字方法,歡迎得道你的支持。
posted on 2008-04-22 20:58 冷面閻羅 閱讀(2102) 評論(2) 編輯 收藏 所屬分類: java