WEB开发网
开发学院数据库MSSQL Server 单句SQL语句的解析方案 阅读

单句SQL语句的解析方案

 2009-02-05 10:20:54 来源:WEB开发网   
核心提示: select c1,c2,c3 from t1,t2 where condi3=3 or condi4=5 order by o1,o2通过观察我们可以发现,select子句是select c1,c2,c3 from,单句SQL语句的解析方案(2),它的起始标志是select,结束标志是f

select c1,c2,c3 from t1,t2 where condi3=3 or condi4=5 order by o1,o2

通过观察我们可以发现,select子句是select c1,c2,c3 from,它的起始标志是select,结束标志是from;from子句是from t1,t2 where,它的起始标志是from,结束标志是where;where子句是where condi3=3 or condi4=5,它的起始标志是where,结束标志是order by;order by子句是order by o1,o2其起始标志是order by,刚才我们在整句SQL尾后加上了" ENDOFSQL"字样,因此,order by子句的结束标志是" ENDOFSQL"。

这个分析给我们解析SQL语句提供了一个思路,如果我们能找到各个子句的前后标志,在正则表达式的帮助下我们就可以轻松的获得每一种子句,下面给出一个找到from子句的完整正则表达式:

"(from)(.+)( where | on | having | groups+by | orders+by | ENDOFSQL)"

这句正则表示式让程序到整句SQL中查找符合这样条件的文本单元:它以from开头,结束标志是where,on,having,group by,order by或语句结束中间的一个,开始标志和结束标志之间可以是任何字符。这样,from子句的各种情况就都囊括进这个正则表达式了,它能找到以下类型的各种form子句:

from .... where

from .... on

from .... having

from .... group by

from .... order by

from .... ENDOFSQL(这个ENDOFSQL是预处理时加上的,如果用$符号会给程序造成麻烦)

3.找到片段中的各个部分。

有了表示片段的正则表达式,找到片段后从中分离出片段起始标志start,片段主体body和片段结束标志end就很容易了,请见代码:

Pattern pattern=Pattern.compile(segmentRegExp,Pattern.CASE_INSENSITIVE);
 for(int i=0;i<=sql.length();i++){
  String shortSql=sql.substring(0, i);
  //System.out.println(shortSql);
   Matcher matcher=pattern.matcher(shortSql);
   while(matcher.find()){
    start=matcher.group(1);// 片段起始标志start
  body=matcher.group(2);// 片段主体body
  end=matcher.group(3);// 片段结束标志end
  parseBody();
  return;
   }
 }

上一页  1 2 3 4 5  下一页

Tags:单句 SQL 语句

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接