这是您提到的链接的简单扩展。
为了遍历解析树,JSqlParser提供了访问者模式。在这里,我重用了TablesNamesFinder,它为您的目的使用了访问所有节点的完整实现。现在,你的 sql 嵌套的深度已经不重要了。对于被覆盖方法的每次调用,您都会获得主 SQL 或 SQL 的子选择。
public static void main(String args[]) throws JSQLParserException {
String sql = "SELECT * FROM CUSTOMERS WHERE ID IN (SELECT ID FROM CUSTOMERS WHERE SALARY > 4500)";
Select select = (Select) CCJSqlParserUtil.parse(sql);
TablesNamesFinder tablesNamesFinder = new TablesNamesFinder() {
@Override
public void visit(PlainSelect plainSelect) {
System.out.println("plainselect -> " + plainSelect.toString());
for (SelectItem item : plainSelect.getSelectItems()) {
System.out.println(item.toString());
}
super.visit(plainSelect);
}
};
tablesNamesFinder.getTableList(select);
}