多重子查詢提取每次子查詢的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)鍵字方法,歡迎得道你的支持。
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)鍵部分的代碼:
































問題是:對于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