java - 如何使用 JSQLparser 从 "From Clause"获取多个子查询?

标签 java mysql sql subquery jsqlparser

我想获取 from 子句中的所有子查询,但是当我使用时

 FromItem fromItems = plainSelect.getFromItem();

它只是检索 from 子句中的第一个子查询以及当我使用时

 Expression exp = plainSelect.getJoins().get(i);

它检索 from 语句中的表而不是子查询。

最佳答案

这里是一些代码片段。您必须知道,第一个表/子选择存储在 PlainSelect 的 fromItem 中,并且以下内容存储在联接中。你必须处理两者。这是由于 JSqlParser 使用的解析架构。

在 JSqlParser 中,您有两种类型的遍历返回的对象层次结构:1. 访问者模式,2. 直接对象层次结构访问。我在这个小例子中实现了两者。

编辑:为了查找 JSqlParser 标识的分层所有子查询,我添加了 Type 3,这是一种 hack,因为我不知何故误用了解析器。

public class SimpleSqlParser10 {
    public static void main(String args[]) throws JSQLParserException {
        String sql = "SELECT * FROM myTable, (select * from myTable2) as data1, (select b from myTable3) as data2";
        Select select = (Select)CCJSqlParserUtil.parse(sql);
        System.out.println(select.toString());


        System.out.println("Type 1: Visitor processing");
        select.getSelectBody().accept(new SelectVisitorAdapter(){
            @Override
            public void visit(PlainSelect plainSelect) {
                plainSelect.getFromItem().accept(fromVisitor);
                if (plainSelect.getJoins()!=null)
                   plainSelect.getJoins().forEach(join -> join.getRightItem().accept(fromVisitor));
            }
        });

        System.out.println("Type 2: simple method calls");
        processFromItem(((PlainSelect)select.getSelectBody()).getFromItem());
        if (((PlainSelect)select.getSelectBody()).getJoins()!=null)
            ((PlainSelect)select.getSelectBody()).getJoins().forEach(join -> processFromItem(join.getRightItem()));


        System.out.println("Type 3: hierarchically process all subselects");
        select.getSelectBody().accept(new SelectDeParser() {
            @Override
            public void visit(SubSelect subSelect) {
                System.out.println("  found subselect=" + subSelect.toString());
                super.visit(subSelect);             }
        });
    }

    private final static FromItemVisitorAdapter fromVisitor = new FromItemVisitorAdapter() {
        @Override
        public void visit(SubSelect subSelect) {
            System.out.println("subselect=" + subSelect);
        }

        @Override
        public void visit(Table table) {
            System.out.println("table=" + table);
        }
    } ;

    private static void processFromItem(FromItem fromItem) {
        System.out.println("fromItem=" + fromItem);
    }
}

这个输出

SELECT * FROM myTable, (SELECT * FROM myTable2) AS data1, (SELECT b FROM myTable3) AS data2
Type 1: Visitor processing
table=myTable
subselect=(SELECT * FROM myTable2) AS data1
subselect=(SELECT b FROM myTable3) AS data2
Type 2: simple method calls
fromItem=myTable
fromItem=(SELECT * FROM myTable2) AS data1
fromItem=(SELECT b FROM myTable3) AS data2
Type 3: hierarchically process all subselects
  found subselect=(SELECT * FROM myTable2) AS data1
  found subselect=(SELECT b FROM myTable3) AS data2

关于java - 如何使用 JSQLparser 从 "From Clause"获取多个子查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45837017/

相关文章:

java - 确保java中的完整数组

java - 如何在 selenium webdriver 中选择单选按钮?动态选择单选按钮

java - 为什么要使用 getter 和 setter/accessors?

MYSQL 查找重复值的计数

MySQL 对于某些日期给出了错误的日期时间值,但对于其他日期却没有给出错误的日期时间值

java - 电子邮件的附件?

php - 插入表中的重复数据集

Android Sqlite 如果不存在则插入

php - SQL从多个表中选择并按一定条件排序

mysql - 1-多-多的数据库结构