[英]get table name from query
对于许多人来说,我的问题应该很简单Supouse我有以下SQL,并且我想使用regexp获取表名:
SELECT name, age FROM table1
使用这个表达式我可以确定
Pattern p = Pattern.compile(".*FROM\\s+(.*?)($|\\s+[WHERE,JOIN,START\\s+WITH,ORDER\\s+BY,GROUP\\s+BY])", Pattern.CASE_INSENSITIVE);
Matcher result = p.matcher(pSql);
if (result.find()) {
lRetorno = result.group(1);
}
但是,如果表名包含模式名(xyz.table1),我的表达式将带所有内容。 我的问题是...我需要在此查询上修改什么,以便仅向我返回没有模式/所有者的表名?
任何帮助将是万分感谢
拉斐尔·莫伊塔(Raphael Moita)
也许这样尝试
String data1="SELECT name, age FROM table1 whatever";
String data2="SELECT name, age FROM schema.table1 whatever";
Pattern p=Pattern.compile("from\\s+(?:\\w+\\.)*(\\w+)($|\\s+[WHERE,JOIN,START\\s+WITH,ORDER\\s+BY,GROUP\\s+BY])",Pattern.CASE_INSENSITIVE);
//test
Matcher m=p.matcher(data1);
while(m.find())
System.out.println(m.group(1));
m=p.matcher(data2);
while(m.find())
System.out.println(m.group(1));
输出:
table1
table1
我只是意识到部分($|\\\\s+[WHERE,JOIN,START\\\\s+WITH,ORDER\\\\s+BY,GROUP\\\\s+BY])
不能正常工作,因为在我的输入中在表名之后放置“任何”,仍然可以找到它。
由于您使用的是[WHERE,JOIN,START\\\\s+WITH,ORDER\\\\s+BY,GROUP\\\\s+BY]
而不是(WHERE|JOIN|START\\\\s+WITH|ORDER\\\\s+BY|GROUP\\\\s+BY)
。 例如, [abc]
等于(a | b | c),因此它说正则表达式引擎接受该集合中的任何字符,而不是单词abc
。 改善您的模式,例如
Pattern p=Pattern.compile("from\\s+(?:\\w+\\.)*(\\w+)(\\s*$|\\s+(WHERE|JOIN|START\\s+WITH|ORDER\\s+BY|GROUP\\s+BY))",Pattern.CASE_INSENSITIVE);
与其使用正则表达式进行解析,不如使用实际的解析器,可能会有更好的时间。 请参阅此相关问题, 需要Java API来解析推荐Zql库的SQL语句 。
它具有可以解析的查询的示例,这些示例似乎至少与要编写的任何正则表达式一样强大。
InputStream is = new ByteArrayInputStream(sqlQueryString.getBytes("UTF-8"));
ZqlParser parser = new ZqlParser(is);
ZQuery query = (ZQuery)parser.readStatement();
Vector tables = query.getFrom();
应该为你做。 tables
是ZFromItem
的Vector
,您可以对其中一个执行getTable()
以获取其名称,而无需使用架构组件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.