冷面阎罗

低调做人&&高调做事
随笔 - 208, 文章 - 3, 评论 - 593, 引用 - 0
数据加载中……

多重子查询提取每次子查询的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关键字方法,欢迎得道你的支持。

posted on 2008-04-22 20:58 冷面阎罗 阅读(2082) 评论(2)  编辑  收藏 所属分类: java

评论

# re: 多重子查询提取每次子查询的SQL语句  回复  更多评论   

上午又对核心算法优化一下,可以处理多个并列的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语句  回复  更多评论   

尽量不要在循环里写sql语句,很容易造成不良危险
2008-04-25 14:44 | 懒人

只有注册用户登录后才能发表评论。


网站导航: