gpt4 book ai didi

java - 使用 JSqlParser 完全解析 where 子句

转载 作者:行者123 更新时间:2023-11-30 07:51:37 25 4
gpt4 key购买 nike

我想使用 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());
}
});

这将产生输出:

a=3
b=4
c=5

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

我知道您可以像这样为每种类型的运算符覆盖访问函数:

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());
}

});

这会得到这个输出:

a
=
3
a=3
b
=
4
b=4
c
=
5
c=5

但这只涵盖了用 AND 连接在一起的 EqualsTo 条件语句。如您所见,您必须为每个逻辑运算符创建一个 if 语句,并为每个比较运算符覆盖 visit() 函数。有更简单的方法吗?

最佳答案

使用ExpressionVisitorAdapter,您可以覆盖

protected void visitBinaryExpression(BinaryExpression expr)

每个表达式都会调用它。

操作也是 BinaryExpressions。所以你需要通过 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);
}
});

这个输出:

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

关于java - 使用 JSqlParser 完全解析 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46800058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com