我要从一个sql的字符串中提取查询的column的单词,如:
select name, address as addr from t_employee因为这里面可能存在as关键字,而且单词之间可能存在未知数目的空格,我想提取的是name和addr。该如何提取,要做成一个通用的函数,可以针对任何select语句

解决方案 »

  1.   

    用=
    select name, address = addr from t_employee
      

  2.   

    select语句是一个string,
    我要从这个string中把要查询的column的名字提取出来,
    比如说下面的select语句查询了name 和 addr,我想通过一些字符串处理函数把这两个字符串提取出来,放在一个字符串数组里面。
    例如:
    select name, address as addr from t_employee我想得到的结果是
    string [] attr = {"name","addr"};
      

  3.   

    我写了一个函数,但不知道是否还能再优化一下,请高手指点private Vector getKeyList(){
            if(queryString==null||queryString.equals("")){
                return null; 
            }
            Vector vKeys=new Vector();
            int end = queryString.indexOf("from");
            String temp = queryString.substring(6, end);
            temp=temp.trim();
            String keyList[]=temp.split(",");
            for(int i=0;i<keyList.length;i++){
                //keyList[i]=keyList[i].trim();
                String keyname = keyList[i];
                if(keyname.split(" as ").length<=1){
                    vKeys.add(keyname.trim().toUpperCase());
                }else{
                    String keys[]=keyname.split(" as ");
                    String key=keys[keys.length-1];
                    vKeys.add(key.trim().toUpperCase());
                }
            }
            return vKeys;
        }
      

  4.   

    这里的queryString是一个类成员变量,用来存放一条select语句
      

  5.   

    我提供给楼主一个方法流程,供楼主参考:
    1.提取select和from之间的字符串
    2.使用trim()方法去掉前后的空格
    3.(1)使用String的indexOf()方法查找",",如果没查到说明就是一列,如果查到就截取成一个
         字符串数组,然后在对数组中的元素进行解析,解析的条件是查找"as",方法如上,这样就
         解析出了每一个列.
      (2)使用StringTokenizer类,具体的方法你可以查以下API.(java.util包下)
         偶认为对字符串进行解析使用此类是最方便的了!!!!
    4.对与不对,还是要请楼主相信JVM.
    5.OVER.
      

  6.   

    public static void main(String[] args){
            String sql = "select  asdf, asdf as faseo  , asdfeq as oife, fqwe   from asdffa";
            List rslt = getColumn(sql);
            for(int i = 0; i < rslt.size(); i++){
                System.out.println((String)rslt.get(i));
            }
        }
        
        private static List getColumn(String sql){
            List rslt = new ArrayList();
            String[] array = sql.substring(0, sql.indexOf(" from ")).replaceAll("[ ]{1,},", ",").split(" ");
            for(int i = 0; i < array.length; i++){
                if(array[i].endsWith(",")){
                    rslt.add(array[i].substring(0, array[i].length() - 1));
                } else if (i == array.length - 1) {
                    rslt.add(array[i]);
                }
            }
            return rslt;
        }
      

  7.   

    主要就是,先把字符串截到from关键字,再把逗号前面的空格去掉。
    不管它有没有as关键字,反正逗号前面的东西就是column的名字,最后一个单词也是。
      

  8.   

    主要就是,先把字符串截到from关键字,再把逗号前面的空格去掉。
    不管它有没有as关键字,反正逗号前面的东西就是column的名字,最后一个单词也是。
    好办法
      

  9.   

    回复人:whysdhr(费那事干嘛!一锤子砸下去不就完了吗!) ( 一级(初级)) 信誉:100  2006-08-02 11:18:00  得分:0

    我提供给楼主一个方法流程,供楼主参考:
    1.提取select和from之间的字符串
    2.使用trim()方法去掉前后的空格
    3.(1)使用String的indexOf()方法查找",",如果没查到说明就是一列,如果查到就截取成一个
    字符串数组,然后在对数组中的元素进行解析,解析的条件是查找"as",方法如上,这样就
    解析出了每一个列.
    (2)使用StringTokenizer类,具体的方法你可以查以下API.(java.util包下)
    偶认为对字符串进行解析使用此类是最方便的了!!!!
    4.对与不对,还是要请楼主相信JVM.
    5.OVER.
    我上面的代码就是按照你的3 (1)的方法做的,
    StringTokenizer类没有用过,偶去查查资料看,会不会更简便
      

  10.   

    jackyyb(最酷的) 给出了非常好的答案
      

  11.   

     回复人:do_the_best(近我者赤) ( 一级(初级)) 信誉:100  2006-08-02 11:28:00  得分:0

    public static void main(String[] args){
    String sql = "select asdf, asdf as faseo , asdfeq as oife, fqwe from asdffa";
    List rslt = getColumn(sql);
    for(int i = 0; i < rslt.size(); i++){
    System.out.println((String)rslt.get(i));
    }
    }private static List getColumn(String sql){
    List rslt = new ArrayList();
    String[] array = sql.substring(0, sql.indexOf(" from ")).replaceAll("[ ]{1,},", ",").split(" ");
    for(int i = 0; i < array.length; i++){
    if(array[i].endsWith(",")){
    rslt.add(array[i].substring(0, array[i].length() - 1));
    } else if (i == array.length - 1) {
    rslt.add(array[i]);
    }
    },
    return rslt;
    }
    这个方法我试过了,是可行的,而且程序比较简洁,学会了使用endswith()方法,赞一个。
    能否再解释一下这句话:
    String[] array = sql.substring(0, sql.indexOf(" from ")).replaceAll("[ ]{1,},", ",").split(" ");
    中的[]{1,},的含义,如何去掉逗号前后的空格的?
    这个应该是个正则表达式,我正想学一下正则表达式的使用方法,请指点一下。
      

  12.   

    java.sql.ResultSet rs = stmt.executeQuery(sql);
    String[] cols = new String[rs.getMetaData().getColumnCount()];
    for(int i = 0;i<cols.length;i++){
    cols[i] = rs.getMetaData().getColumnName(i+1);
    }
      

  13.   

    dreamover(梦醒了):
    你的代码不对!
    当字段有alias的时候,你取到的是alias而不是真实字段名
      

  14.   

    回复人:hbwhwang() ( 一级(初级)) 信誉:100  2006-08-02 12:18:00  得分:0

    jackyyb(最酷的) 给出了非常好的答案
    谢谢你的夸奖,但是我觉得我的方法太死板了,有点像米里面挑沙子,就把整担米打翻了,一粒一粒挑的意思,do_the_best(近我者赤) 的方法不错,比较正规,只是不太理解他的正则表达式是如何用的,很想编出像这样的程序。
      

  15.   

    jackyyb(最酷的) :
    没有交通工具,难道就不能走路?你给出了走路的捷径,这也不错
      

  16.   

    回复人:dreamover(梦醒了) ( 五级(中级)) 信誉:100  2006-08-02 12:26:00  得分:0

    java.sql.ResultSet rs = stmt.executeQuery(sql);
    String[] cols = new String[rs.getMetaData().getColumnCount()];
    for(int i = 0;i<cols.length;i++){
    cols[i] = rs.getMetaData().getColumnName(i+1);
    }
    这种方法是否一定要连接数据库并且运行sql语句才能得到结果呢?如果查询的结果集为空会怎么样?还有就是hbwhwang()提的别名的问题
      

  17.   

    hbwhwang() :
    呵呵,你说的很对,就像不会开汽车,我们就走路好了,我赞同你的观点,但是如果能够掌握其他的交通工具,可以使我们的出行更加的方便,所以我们会去学开汽车,开摩托。
    我对java的类库不是很了解,我以前是C/C++程序员,所以在写这种程序的时候只能用最通俗,最基本的方法去做,但同时我觉得有必要学一学其他java类库中的一些更有效,更快捷的方法。你说呢
      

  18.   

    jackyyb(最酷的) :
    不可能总是学习,你的第一目的是解决问题,只要问题能在有限的资源、有限的时间内解决,什么方法都行。
    这段代码不复杂,写起来很快,因此没有必要为了这个而学习正则表达式。我学正则表达式已经2次了,现在只记得一点点。为什么出现这种情况?就是因为我学了没用,没用就忘记了!!
      

  19.   

    查select 和 from 之间的词是不对的比如sql语句 :select name,sex,ID,(select Othor from table2 where code = ID) as ddd from table1