使用 JSqlParser 完全解析 where 子句

cod*_*ing 4 java sql jsqlparser

我想使用 JSqlParser 完整、简洁地解析 SQL where 子句。很容易将其解析为单独的条件语句,如下所示

String whereClause = "a=3 AND b=4 AND c=5";
Expression expr = CCJSqlParserUtil.parseCondExpression(whereClause);
expr.accept(new ExpressionVisitorAdapter() {

    @Override
    public void visit(AndExpression expr) {
        if (expr.getLeftExpression() instanceof AndExpression) {
            expr.getLeftExpression().accept(this);
        } else if ((expr.getLeftExpression() instanceof EqualsTo)){
            System.out.println(expr.getLeftExpression());
        }
        System.out.println(expr.getRightExpression());
    }
 });
Run Code Online (Sandbox Code Playgroud)

这将产生输出:

a=3
b=4
c=5
Run Code Online (Sandbox Code Playgroud)

我想要的是获取每个单独表达式的左侧、运算符和右侧,以便我可以将值放入一些现有的过滤器对象中。

我知道您可以覆盖每种类型的运算符的访问函数,如下所示:

expr.accept(new ExpressionVisitorAdapter() {

@Override
public void visit(AndExpression expr) {
    if (expr.getLeftExpression() instanceof AndExpression) {
        expr.getLeftExpression().accept(this);
    } else if ((expr.getLeftExpression() instanceof EqualsTo)){
        expr.getLeftExpression().accept(this);
        System.out.println(expr.getLeftExpression());
    }
    expr.getRightExpression().accept(this);
    System.out.println(expr.getRightExpression());
}
@Override
public void visit(EqualsTo expr) {
    System.out.println(expr.getLeftExpression());
    System.out.println(expr.getStringExpression());
    System.out.println(expr.getRightExpression());
}
Run Code Online (Sandbox Code Playgroud)

});

这将为您提供以下输出:

a
=
3
a=3
b
=
4
b=4
c
=
5
c=5
Run Code Online (Sandbox Code Playgroud)

但这仅涵盖通过 AND 组合在一起的 EqualsTo 条件语句。正如您所看到的,您必须为每个逻辑运算符创建一个 if 语句,并为每个比较运算符重写 Visit() 函数。有更简单的方法吗?

wum*_*mpz 5

使用ExpressionVisitorAdapter,您可以覆盖

protected void visitBinaryExpression(BinaryExpression expr)
Run Code Online (Sandbox Code Playgroud)

每个表达式都需要它。

操作也是二元表达式因此,您需要通过 instanceof ComparisonOperator检查类型。这将处理所有比较器,而不是像 + * 这样的操作。

这应该可以做到。我删除了 AND 的访问,并用更多表达式扩展了你的 whereClause。

    String whereClause = "a=3 AND b=4 AND c=5 AND d>5 AND x<10";
    Expression expr = CCJSqlParserUtil.parseCondExpression(whereClause);
    expr.accept(new ExpressionVisitorAdapter() {

        @Override
        protected void visitBinaryExpression(BinaryExpression expr) {
            if (expr instanceof ComparisonOperator) {
                System.out.println("left=" + expr.getLeftExpression() + "  op=" +  expr.getStringExpression() + "  right=" + expr.getRightExpression());
            }

            super.visitBinaryExpression(expr); 
        }
    });
Run Code Online (Sandbox Code Playgroud)

这输出:

left=a  op==  right=3
left=b  op==  right=4
left=c  op==  right=5
left=d  op=>  right=5
left=x  op=<  right=10
Run Code Online (Sandbox Code Playgroud)