我有一条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

解决方案 »

  1.   

    hibernate自带生成SQL,在里面配置的吧?
    不过话说回来都不知道你说的是什么意思?优化数据?
      

  2.   

    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'这个 等同于
    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%'这种的要拼装哈
      

  3.   

    简单的说,怎么简化这个String吧。把 【字段】 LIKE ‘%’ 去掉
      

  4.   

    楼主的意思是不是要写个程序,去掉where 后边有like的条件?
      

  5.   

    对的,但是要有选择性的去掉,【字段】 LIKE '%' 这个的时候才去掉 像这种 【字段】 LIKE '%CA%' 是不能去掉的
      

  6.   

    楼主的sql写的还是很神奇的哦!
      

  7.   

    不是我写的SQL 神奇,是系统的特殊性造成生成的SQL是这样的,系统是参数驱动的,不是hard code的
      

  8.   


    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);
       }
      

  9.   

    你能告诉我sql的所有条件的连接符都有什么吗? 比如and ,or ,in 还有什么?
    可以先写一个只处理简单连接间的like条件的程序。二分查找like 或者 like ‘%' ,然后往前找连接符号,把连接符号到 '%' 中的文字替换掉。
      

  10.   

    WHERE 条件后面能出现的连接符都有可能出现
      

  11.   


    这个正则不错,不过sql可能是嵌套的,比如
    后边还有 ... or abc in (select * from table where (abc like '%' or bcd like '%') and bcd = '123' )
      

  12.   

    这个有个问题,又改了一下:
    sql = sql.replaceAll("(?is)\\w+\\s+like\\s+'%'\\s+and|and\\s+\\w+\\s+like\\s+'%'\\s*|where\\s\\w+\\s+like\\s+'%'\\s*$","");
      

  13.   


    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 '%'
    //求验证
      

  14.   

    连接符不止是AND  有可能的连接符都要考虑到,求修改。。
      

  15.   

    匹配where aa like '%'
    如果where条件后面只有 aa like '%'
    要替换成 1=1 而不是替换成 “”
     
      

  16.   

    大侠,我现在这么考虑,我先截取WHERE后面的字符串,所以匹配 where aa like '%'
    就不用考虑写,然后我加上了对 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*","");
      

  17.   


    //试试这个呢?
    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]);
          }
       }