我想完整地,简洁地使用JSqlParser解析SQL where子句。人们很容易把它解析为单独的条件语句,像这样使用JSqlParser完全解析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
但这仅涵盖那些与运算一起EqualsTo条件语句。正如你所看到的,你将不得不为每个逻辑运算符创建一个if语句,并为每个比较运算符重写visit()函数。有没有更简单的方法来做到这一点?
致谢输入字符串下面的输出为答案。如果我可以对它投票,我会。这是一个很大的帮助。但是,您的解决方案不能完全解析where子句。它只显示比较本身。我会发布一个更完整的答案,我来。 – codering
好的。我认为我的解决方案就是你想达到的。 Missinterpretation。所以我投票给你。 :) – wumpz