??? select * from tableA union select * from tableB
????要根據(jù)關(guān)鍵字把兩個(gè)查詢語(yǔ)句分解出來(lái),即得到
?? select * from tableA 和 select * from tableB
?? 一般的做法是:
?String sql="select * from tableA union select * from tableB";
?? if(sql.toLowerCase().indexOf(" union ")>-1){
??? String sql2[]=sql.split(" union ");
??? for(int i=0;i<sql2.length;i++){
????? System.out.println(sql2[i]);
??? }
? }
?但因?yàn)檫@個(gè)是SQL語(yǔ)句,union關(guān)鍵字不區(qū)分大小寫的,所有sql語(yǔ)句有這些情況:
?select * from tableA?UNION select * from tableB
?select * from tableA?UnIOn select * from tableB
?select * from tableA?UNiON select * from tableB
?……
所以單單用這樣的語(yǔ)句:String sql2[]=sql.split(" union ");
是分解不出子語(yǔ)句的。
這里的碰到了特殊情況,我不知道別人是怎么做的,我的思路是應(yīng)該有種機(jī)制sql.split(不區(qū)分大小寫);
String類沒提供該方法,于是我覺得先看看SUN的源碼,了解它的源碼
是怎么處理的,找到了:
public int indexOf(String str) {
?return indexOf(str, 0);
??? }
?public String[] split(String regex, int limit) {
?return Pattern.compile(regex).split(this, limit);
??? }
它運(yùn)用的不過(guò)是正則表達(dá)式而已,幸好這幾天對(duì)正則表達(dá)式有所研究。
看看正則表達(dá)式:
DEELX 正則表達(dá)式匹配模式
匹配時(shí)忽略大小寫。默認(rèn)情況下,正則表達(dá)式是要區(qū)分大小寫的。不管是否指定忽略大小寫模式,字符類,比如 [A-Z] 是要區(qū)分大小寫的。
DEELX 支持對(duì) IGNORECASE, SINGLELINE, MULITLINE, GLOBAL 進(jìn)行修改?
a(b(?i)c)d | 增加 i - IGNORECASE 模式,只對(duì) c 起作用。表達(dá)式可以匹配 "abcd" 和 "abCd" |
String sql2[]=sql.split(" union ");
修改為
String sql2[]=sql.split(" (?i)union ");
問(wèn)題即可迎刃而解。
完整的:
String sql="select * from tableA union select * from tableB";
?? if(sql.toLowerCase().indexOf(" union ")>-1){
??? String sql2[]=sql.split(" (?i)union ");
??? for(int i=0;i<sql2.length;i++){
????? System.out.println(sql2[i]);
??? }
? }
打印結(jié)果:
select * from tableA
select * from tableB