JSQLParser 凝胶查询和子查询中的所有 select 项

JSQLParser gel all select items from query and subquery

我想从查询和子查询中获取所有 select 项

按照这个 link, 我可以从主查询中得到 select 项。

对于这样的子查询 - "SELECT * FROM CUSTOMERS WHERE ID IN (SELECT ID FROM CUSTOMERS WHERE SALARY > 4500)",我必须导航到 selectbody -> where -> rightItemList -> again selectbody -> finally items.

此外,还可以有更多的嵌套 select。如何使用 subquery/subqueries 和不使用子查询来实现它?

这是您提到的 link 的简单扩展。

遍历解析树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);
}