0

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

根据此链接,https://stackoverflow.com/a/30505741/8249665我可以从主查询中获取选择项。

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

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

4

1 回答 1

1

这是您提到的链接的简单扩展。

为了遍历解析树,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);
}
于 2020-04-22T10:49:30.557 回答