[英]Get Table names and Query types from sql statement in JAVA
我是jsqlparser的新手,並嘗試解析sql語句以獲取表名及其查詢類型(在Java中)。
對於eg1。
INSERT INTO Customers (CustomerName, Country) SELECT SupplierName, Country FROM Suppliers WHERE Country='Germany'
從這個查詢,我想得到表名Suppliers
及其查詢類型SELECT
。
同樣,表名Suppliers
及其查詢類型為INSERT
。
對於eg2。
UPDATE CUSTOMERS SET SALARY = SALARY * 0.25 WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >= 27 )
從這個查詢,我想得到表名CUSTOMERS_BKP
及其查詢類型SELECT
。
同樣,表名CUSTOMERS
及其查詢類型UPDATE
。
對於eg3。
UPDATE CUSTOMERS SET SALARY = SALARY * 0.25 WHERE AGE IN (SELECT AGE FROM CUSTOMERS WHERE AGE >= 27 )
(我知道這個查詢可以簡化,但例如我已粘貼在這里。)
從這個查詢,我想得到表名CUSTOMERS
和它的查詢類型SELECT
。
同樣,表名CUSTOMERS
及其查詢類型UPDATE
。
注意:此處的表名相同但查詢類型不同。
同樣,我想獲取任何復雜的SQL查詢的表名及其查詢類型。
你能幫幫我嗎?
如果您希望我提供任何詳細信息,請發表評論。
您提交的問題很棘手,因為JSqlParsers API缺少一些擴展點。 為了糾正這個問題,我在github上創建了一些問題。 所以這里有一個小樣本來運行。 輸出是:
eg1
INSERT - Customers
SELECT - [Suppliers]
eg2
UPDATE - [CUSTOMERS]
SELECT - [CUSTOMERS_BKP]
eg3
UPDATE - [CUSTOMERS]
SELECT - [CUSTOMERS]
這里的主要工具是JSqlParser的TablesNamesFinder ,它獲取某些SQL的所有表名。 現在我們必須修改它,以單獨的方式獲取所有基於select語句的表名。 這是使用TablesNamesFinderExt完成的,它也可以使用Insert語句糾正子選擇問題。
總之取景器識別子選擇並設置一個全局標志inSelect填寫參觀的后續調用單獨mySelectTableList(表...)。
import java.util.ArrayList;
import java.util.List;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.select.SubSelect;
import net.sf.jsqlparser.statement.update.Update;
import net.sf.jsqlparser.util.TablesNamesFinder;
public class SimpleSqlParserTableNames2 {
public static void main(String args[]) throws JSQLParserException {
System.out.println("eg1");
Insert insert = (Insert)CCJSqlParserUtil.parse("INSERT INTO Customers (CustomerName, Country) SELECT SupplierName, Country FROM Suppliers WHERE Country='Germany'");
TablesNamesFinderExt finder = new TablesNamesFinderExt();
System.out.println("INSERT - " + insert.getTable());
finder.getTableList(insert.getSelect());
System.out.println("SELECT - " + finder.getSelectTableList());
System.out.println("eg2");
Update update = (Update)CCJSqlParserUtil.parse("UPDATE CUSTOMERS SET SALARY = SALARY * 0.25\n" +
" WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >= 27 )");
finder = new TablesNamesFinderExt();
System.out.println("UPDATE - " + update.getTables());
finder.getTableList(update);
System.out.println("SELECT - " + finder.getSelectTableList());
System.out.println("eg3");
update = (Update)CCJSqlParserUtil.parse("UPDATE CUSTOMERS SET SALARY = SALARY * 0.25\n" +
"WHERE AGE IN (SELECT AGE FROM CUSTOMERS WHERE AGE >= 27 )");
finder = new TablesNamesFinderExt();
System.out.println("UPDATE - " + update.getTables());
finder.getTableList(update);
System.out.println("SELECT - " + finder.getSelectTableList());
}
static class TablesNamesFinderExt extends TablesNamesFinder {
List<String> mySelectTableList = new ArrayList<>();
boolean inSelect = true;
/**
* To solve JSqlParsers Problem in getting tablenames from subselect using an Insert
* statement.
*
* @param insert
* @return
*/
@Override
public List<String> getTableList(Insert insert) {
List<String> list = super.getTableList(insert);
if (insert.getSelect() != null) {
insert.getSelect().getSelectBody().accept(this);
}
return list;
}
@Override
public void visit(SubSelect subSelect) {
inSelect = true;
super.visit(subSelect);
}
@Override
public void visit(Table tableName) {
super.visit(tableName);
if (inSelect && !mySelectTableList.contains(tableName.getFullyQualifiedName()))
mySelectTableList.add(tableName.getFullyQualifiedName());
}
public List<String> getSelectTableList() {
return mySelectTableList;
}
}
}
如果你只需要表格形式的SQL,你需要一個超輕,超快的libray(完整的SQL解析器將被殺死)
只需在您的pom中添加以下內容即可
<dependency>
<groupId>com.github.mnadeem</groupId>
<artifactId>sql-table-name-parser</artifactId>
<version>0.0.1</version>
</dependency>
並使用以下說明
new TableNameParser(sql).tables()
有關詳細信息,請參閱該項目
免責聲明:我是所有者
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.