我有一条sql:
SELECT ACC_SH_NM,C_AC_NUMBER,ACC_TP_CD,ACC_BK_NM_3RD,C_CURRENCY,ACC_STAT_CD,CUST_BOS_ID FROM EXIMSYS.STD_AC_NUMBER WHERE C_CURRENCY LIKE '%' AND
C_AC_NUMBER LIKE '%' AND
ACC_TP_CD LIKE '%' AND
ACC_SH_NM LIKE '%' AND
ACC_BK_NM_3RD LIKE '%' AND
ACC_STAT_CD LIKE '%' AND CUST_BOS_ID= 'C000001'这里面有很多 【字段】 LIKE '%' 这种,用很多like 会不会影响数据库执行的效率,现在我想把 【字段】 LIKE '%'
去掉,用java实现,怎么整呢?要考虑的全面一点。SQL有很多种情况语句中或多或少会产生一些 【字段】 LIKE '%'
,不要问我怎么生成的SQL 会带这么多 LIKE 这是系统的特殊性造成的,所以要后期再用java去掉LIKE
SELECT ACC_SH_NM,C_AC_NUMBER,ACC_TP_CD,ACC_BK_NM_3RD,C_CURRENCY,ACC_STAT_CD,CUST_BOS_ID FROM EXIMSYS.STD_AC_NUMBER WHERE C_CURRENCY LIKE '%' AND
C_AC_NUMBER LIKE '%' AND
ACC_TP_CD LIKE '%' AND
ACC_SH_NM LIKE '%' AND
ACC_BK_NM_3RD LIKE '%' AND
ACC_STAT_CD LIKE '%' AND CUST_BOS_ID= 'C000001'这里面有很多 【字段】 LIKE '%' 这种,用很多like 会不会影响数据库执行的效率,现在我想把 【字段】 LIKE '%'
去掉,用java实现,怎么整呢?要考虑的全面一点。SQL有很多种情况语句中或多或少会产生一些 【字段】 LIKE '%'
,不要问我怎么生成的SQL 会带这么多 LIKE 这是系统的特殊性造成的,所以要后期再用java去掉LIKE
解决方案 »
- 如何在ubuntu 12.10上安装jdk-7u10-nb-7_2_1-linux-x64-ml.sh,需要详解!
- 我做毕业设计遇到了点问题,急
- 用 javamial发邮件时,右下角会出现进度条,怎么才能不让他显示呢?
- FileInputStream类问题,高手请进!
- 同一SE项目中,是否可以对不同JPanel 定义不同的风格?
- 100分求JB8的注册码或注册文件
- how can I get com.bruceeckel.util.*;
- ?? 在后台生成一个html页面,用来存档 ??
- 非常简单的些java概念问题
- JAVA SDK 安装哪个?
- 请问jtable中单元格点击怎么弹出日期控件和下拉列表
- 关于MySQL执行查询在JTable中显示结果的问题
不过话说回来都不知道你说的是什么意思?优化数据?
C_AC_NUMBER LIKE '%' AND
ACC_TP_CD LIKE '%' AND
ACC_SH_NM LIKE '%' AND
ACC_BK_NM_3RD LIKE '%' AND
ACC_STAT_CD LIKE '%' AND CUST_BOS_ID= 'C000001'这个 等同于
SELECT ACC_SH_NM,C_AC_NUMBER,ACC_TP_CD,ACC_BK_NM_3RD,C_CURRENCY,ACC_STAT_CD,CUST_BOS_ID FROM EXIMSYS.STD_AC_NUMBER WHERE CUST_BOS_ID= 'C000001'
这个吧java中判断ACC_STAT_CD LIKE '%' 有这种类型的就不要拼装到sql中,ACC_STAT_CD LIKE '%A%'这种的要拼装哈
public static void main(String args[]){
String sql = "SELECT ACC_SH_NM,C_AC_NUMBER,ACC_TP_CD,ACC_BK_NM_3RD,C_CURRENCY,ACC_STAT_CD,CUST_BOS_ID FROM EXIMSYS.STD_AC_NUMBER ";
sql+= "WHERE C_CURRENCY LIKE '%' AND C_AC_NUMBER LIKE '%' AND ACC_TP_CD LIKE '%' AND ACC_SH_NM LIKE '%' AND";
sql+= "ACC_BK_NM_3RD LIKE '%' AND ACC_STAT_CD LIKE '%' AND CUST_BOS_ID= 'C000001'";
sql = sql.replaceAll("(?is)\\w+\\s+like\\s+'%'\\s+and","");
System.out.println(sql);
}
可以先写一个只处理简单连接间的like条件的程序。二分查找like 或者 like ‘%' ,然后往前找连接符号,把连接符号到 '%' 中的文字替换掉。
这个正则不错,不过sql可能是嵌套的,比如
后边还有 ... or abc in (select * from table where (abc like '%' or bcd like '%') and bcd = '123' )
sql = sql.replaceAll("(?is)\\w+\\s+like\\s+'%'\\s+and|and\\s+\\w+\\s+like\\s+'%'\\s*|where\\s\\w+\\s+like\\s+'%'\\s*$","");
public static void main(String args[]){
String sqls[] = {"select * from t where aa like '%'",
"select * from t where aa like '%' and bb like '%aa'",
"select * from t where bb like '%aa' and aa like '%'"};
for(int i=0;i<sqls.length;i++){
System.out.println(sqls[i].replaceAll("(?is)\\w+\\s+like\\s+'%'\\s+and|and\\s+\\w+\\s+like\\s+'%'\\s*|where\\s\\w+\\s+like\\s+'%'\\s*$",""));
}
}
//(is):全字符匹配,忽略大小写
//\\w+\\s+like\\s+'%'\\s+and:匹配aa like '%' and
//and\\s+\\w+\\s+like\\s+'%'\\s*:匹配and aa like '%'
//where\\s\\w+\\s+like\\s+'%'\\s*$:匹配where aa like '%'
//求验证
如果where条件后面只有 aa like '%'
要替换成 1=1 而不是替换成 “”
就不用考虑写,然后我加上了对 or 的判断
我修改的正则如下,求大虾指点:
sql = sql.replaceAll("(?is)\\w+\\s+like\\s+'%'\\s+and|(?is)\\w+\\s+like\\s+'%'\\s+or|and\\s+\\w+\\s+like\\s+'%'\\s*|or\\s+\\w+\\s+like\\s+'%'\\s*","");
//试试这个呢?
public static void main(String args[]){
String sqls[] = {"select * from t where aa like '%'",
"select * from t where aa like '%' or bb like '%'",
"select * from t where aa like '%' and bb like '%aa' or cc like '%' and dd like '%dd' or ee like '%'",
"select * from t where bb like '%aa' and aa like '%' or cc like '%' and dd like '%dd' or ee like '%'"};
for(int i=0;i<sqls.length;i++){
sqls[i] = sqls[i].replaceAll("(?is)\\w+\\s+like\\s+'%'\\s+(and|or)|(and|or)\\s+\\w+\\s+like\\s+'%'\\s*","");
sqls[i] = sqls[i].replaceAll("where\\s+\\w+\\s+like\\s+'%'\\s*((and|or)\\s+\\w+\\s+like\\s+'%')*","where 1=1");
System.out.println(sqls[i]);
}
}