我想做个程序,把sql除了常量和参数都替换成大写,如:select /*+ index(event event_pk) */
 count(1)
  from event
 where evtcode = 'some_game'
   and evtno = #evtno#
   and userid = #memberid#
   and giftcode = #giftcode#
替换的结果,是
SELECT /*+ INDEX(EVENTMAST EVENTMAST_PK) */
 COUNT(1)
  FROM EVENTMAST
 WHERE EVTCODE = #evtcode#
   AND EVTNO = #evtno#
   AND USERID = #memberid#
   AND GIFTCODE = #giftcode##是ibatis中参数的定界符

解决方案 »

  1.   

    替换结果有点笔误,更正一下:
    SELECT /*+ INDEX(EVENT EVENT_PK) */
     COUNT(1)
      FROM EVENT
     WHERE EVTCODE = 'some_game'
       AND EVTNO = #evtno#
       AND USERID = #memberid#
       AND GIFTCODE = #giftcode#
      

  2.   

        static String convert(String command){
            Pattern pattern = Pattern.compile("(['#]\\S+)?");
            Matcher matcher = pattern.matcher(command.toUpperCase());
            StringBuffer buffer = new StringBuffer(256);
            while (matcher.find()) {
                matcher.appendReplacement(buffer, matcher.group().toLowerCase());
            }
            matcher.appendTail(buffer);
            return buffer.toString();
        }
            String SQL = "select /*+ index(event event_pk) */\n"+
                " count(1)\n" +
                "  from event\n" +
                " where evtcode = 'some_game'\n" +
                "   and evtno = #evtno#\n" +
                "   and userid = #memberid#\n" +
                "   and giftcode = #giftcode#";
            System.out.println(convert(SQL));SELECT /*+ INDEX(EVENT EVENT_PK) */
     COUNT(1)
      FROM EVENT
     WHERE EVTCODE = 'some_game'
       AND EVTNO = #evtno#
       AND USERID = #memberid#
       AND GIFTCODE = #giftcode#
      

  3.   

    楼上的办法不行,参数名这里只是凑巧都是小写罢了,实际大小写是任意的,但sql的关键字、列名、表名必须大写。
      

  4.   

    for example
    String sql = "select /*+ index(event event_pk) */\n"+
                " count(1)\n" +
                "  from event\n" +
                " where evtcode = 'some_game'\n" +
                "   and evtno = #evtno#\n" +
                "   and userid = #memberid#\n" +
                "   and giftcode = #giftcode#";
    StringBuffer sb = new StringBuffer();
    Pattern p = Pattern.compile("(?s)(.*?\\s*)=(.*?(\n|$))");
    Matcher m = p.matcher(sql);
    while (m.find()) {
        m.appendReplacement(sb, m.group(1).toUpperCase() + "=" + m.group(2));
    }
    m.appendTail(sb);
    System.out.println(sb);
      

  5.   

    这样也行,把=也包括到后面不用转换的组去
    String sql = "select /*+ index(event event_pk) */\n"+
                " count(1)\n" +
                "  from event\n" +
                " where evtcode = 'some_game'\n" +
                "   and evtno = #evtno#\n" +
                "   and userid = #memberid#\n" +
                "   and giftcode = #giftcode#";
    StringBuffer sb = new StringBuffer();
    Pattern p = Pattern.compile("(?s)(.*?\\s*)(=.*?(\n|$))");
    Matcher m = p.matcher(sql);
    while (m.find()) {
        m.appendReplacement(sb, m.group(1).toUpperCase() + m.group(2));
    }
    m.appendTail(sb);
    System.out.println(sb);
      

  6.   

    呵呵,ls的只适合于select,也没有考虑>=之类的,不过select的时候好改,insert,update那些参数呢?
    请问正则开头那个(?s)是什么意思,从没见过这种写法。
      

  7.   

    >=就是=之前多了个>,所以可以在=之前加[<>!]?来达到>=,<=,!=的匹配
    "(?s)(.*?)(([<>!]?=|<>).*?(\n|$))"
    ?s是个开关,一般情况下,.是不匹配空格或换行符的,?s就是让.也能匹配这样的符号
    其实正则考虑的情况未必周到,比如嵌套查询等等,可能情况很复杂,所以最好还是像做语法分析器一样,自己扫描判断
    update还好,跟select差不多,都有=,但是insert情况就比较复杂了,有调系统函数或子查询什么的,正则估计比较难以胜任