之前用的oracle大型数据库,写的sql都是依据oracle的。移动端部分用的不能是oracle数据库,只能采用小型数据库,现场采用db2。
db2大小只能论k为单位,很多基本的sql语法都不支持,尤其多重子查询就不支持,做试验报告的阀值就必须得用这个子查询,没有部分只好将多重子查询提出sql,单独执行。
提取多重子查询的方法倒是不复杂,就是对sql语句循环处理,判断是否含有多个select关键字,如果有从字符串最后一个select处理,截取sql语句,执行,然后将查询的结果替换原先的sql语句,直到循环判断sql语句中只有一个select关键字。
关键部分的代码:
问题是:对于select关键字的处理,目前只知道全是小写select或是全是大写SELECT,实际中select关键字这个不考虑大小写限制,我这边还尚未进行校验,一是比较麻烦二是尚未发现好的方法,目前就是对select关键字依次判断是否是s e l e c t几个字符 ,不考虑大小写。
大家如果有好的处理select关键字方法,欢迎得道你的支持。
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;
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关键字方法,欢迎得道你的支持。