我要从一个sql的字符串中提取查询的column的单词,如:
select name, address as addr from t_employee因为这里面可能存在as关键字,而且单词之间可能存在未知数目的空格,我想提取的是name和addr。该如何提取,要做成一个通用的函数,可以针对任何select语句
select name, address as addr from t_employee因为这里面可能存在as关键字,而且单词之间可能存在未知数目的空格,我想提取的是name和addr。该如何提取,要做成一个通用的函数,可以针对任何select语句
select name, address = addr from t_employee
我要从这个string中把要查询的column的名字提取出来,
比如说下面的select语句查询了name 和 addr,我想通过一些字符串处理函数把这两个字符串提取出来,放在一个字符串数组里面。
例如:
select name, address as addr from t_employee我想得到的结果是
string [] attr = {"name","addr"};
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;
}
1.提取select和from之间的字符串
2.使用trim()方法去掉前后的空格
3.(1)使用String的indexOf()方法查找",",如果没查到说明就是一列,如果查到就截取成一个
字符串数组,然后在对数组中的元素进行解析,解析的条件是查找"as",方法如上,这样就
解析出了每一个列.
(2)使用StringTokenizer类,具体的方法你可以查以下API.(java.util包下)
偶认为对字符串进行解析使用此类是最方便的了!!!!
4.对与不对,还是要请楼主相信JVM.
5.OVER.
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;
}
不管它有没有as关键字,反正逗号前面的东西就是column的名字,最后一个单词也是。
不管它有没有as关键字,反正逗号前面的东西就是column的名字,最后一个单词也是。
好办法
?
我提供给楼主一个方法流程,供楼主参考:
1.提取select和from之间的字符串
2.使用trim()方法去掉前后的空格
3.(1)使用String的indexOf()方法查找",",如果没查到说明就是一列,如果查到就截取成一个
字符串数组,然后在对数组中的元素进行解析,解析的条件是查找"as",方法如上,这样就
解析出了每一个列.
(2)使用StringTokenizer类,具体的方法你可以查以下API.(java.util包下)
偶认为对字符串进行解析使用此类是最方便的了!!!!
4.对与不对,还是要请楼主相信JVM.
5.OVER.
我上面的代码就是按照你的3 (1)的方法做的,
StringTokenizer类没有用过,偶去查查资料看,会不会更简便
?
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,},的含义,如何去掉逗号前后的空格的?
这个应该是个正则表达式,我正想学一下正则表达式的使用方法,请指点一下。
String[] cols = new String[rs.getMetaData().getColumnCount()];
for(int i = 0;i<cols.length;i++){
cols[i] = rs.getMetaData().getColumnName(i+1);
}
你的代码不对!
当字段有alias的时候,你取到的是alias而不是真实字段名
?
jackyyb(最酷的) 给出了非常好的答案
谢谢你的夸奖,但是我觉得我的方法太死板了,有点像米里面挑沙子,就把整担米打翻了,一粒一粒挑的意思,do_the_best(近我者赤) 的方法不错,比较正规,只是不太理解他的正则表达式是如何用的,很想编出像这样的程序。
没有交通工具,难道就不能走路?你给出了走路的捷径,这也不错
?
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()提的别名的问题
呵呵,你说的很对,就像不会开汽车,我们就走路好了,我赞同你的观点,但是如果能够掌握其他的交通工具,可以使我们的出行更加的方便,所以我们会去学开汽车,开摩托。
我对java的类库不是很了解,我以前是C/C++程序员,所以在写这种程序的时候只能用最通俗,最基本的方法去做,但同时我觉得有必要学一学其他java类库中的一些更有效,更快捷的方法。你说呢
不可能总是学习,你的第一目的是解决问题,只要问题能在有限的资源、有限的时间内解决,什么方法都行。
这段代码不复杂,写起来很快,因此没有必要为了这个而学习正则表达式。我学正则表达式已经2次了,现在只记得一点点。为什么出现这种情况?就是因为我学了没用,没用就忘记了!!