簡體   English   中英

從查詢中獲取表名

[英]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();

應該為你做。 tablesZFromItemVector ,您可以對其中一個執行getTable()以獲取其名稱,而無需使用架構組件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM