JsqlParser如何重写一个表达式
JsqlParser how to rewrite a expression
我有一个 sql where 子句:
a > 1 and b < 1 and c = 3
在这种情况下,我想删除 a>1
,如何将其重写为
1 = 1 and b < 1 and c =3
我试过 ExpressionVisitor,但无法重写 Expression
您可以使用类似以下内容的方式简单地替换 SQL 的 where 部分:
((PlainSelect)selectBody).setWhere(CCJSqlParserUtil.parseCondExpression("mycol = 10"));
但是如果你想使用 where 表达式本身并想在其中找到表达式 a > 1,那么你必须使用类似
Select stmt = (Select) CCJSqlParserUtil.parse("select * from a where a > 1 and b < 1 and c = 3");
System.out.println("before " + stmt.toString());
((PlainSelect) stmt.getSelectBody()).getWhere().accept(new ExpressionVisitorAdapter() {
@Override
public void visitBinaryExpression(BinaryExpression expr) {
if ("a > 1".equals(expr.getLeftExpression().toString())) {
try {
expr.setLeftExpression(CCJSqlParserUtil.parseCondExpression("1=1"));
} catch (JSQLParserException ex) {
Logger.getLogger(SimpleSqlParser39ReplaceExpressionInWhere.class.getName()).log(Level.SEVERE, null, ex);
}
}
super.visitBinaryExpression(expr);
}
});
System.out.println("after " + stmt.toString());
这不是一个完整的解决方案,因为您还必须检查正确的表达式。由于您确实无法修改二进制表达式 a > 1 本身,因此您必须查找封闭的表达式并将其替换在那里。这就是主要思想。
顺便说一句,这是这个小片段的输出:
before SELECT * FROM a WHERE a > 1 AND b < 1 AND c = 3
after SELECT * FROM a WHERE 1 = 1 AND b < 1 AND c = 3
我有一个 sql where 子句:
a > 1 and b < 1 and c = 3
在这种情况下,我想删除 a>1
,如何将其重写为
1 = 1 and b < 1 and c =3
我试过 ExpressionVisitor,但无法重写 Expression
您可以使用类似以下内容的方式简单地替换 SQL 的 where 部分:
((PlainSelect)selectBody).setWhere(CCJSqlParserUtil.parseCondExpression("mycol = 10"));
但是如果你想使用 where 表达式本身并想在其中找到表达式 a > 1,那么你必须使用类似
Select stmt = (Select) CCJSqlParserUtil.parse("select * from a where a > 1 and b < 1 and c = 3");
System.out.println("before " + stmt.toString());
((PlainSelect) stmt.getSelectBody()).getWhere().accept(new ExpressionVisitorAdapter() {
@Override
public void visitBinaryExpression(BinaryExpression expr) {
if ("a > 1".equals(expr.getLeftExpression().toString())) {
try {
expr.setLeftExpression(CCJSqlParserUtil.parseCondExpression("1=1"));
} catch (JSQLParserException ex) {
Logger.getLogger(SimpleSqlParser39ReplaceExpressionInWhere.class.getName()).log(Level.SEVERE, null, ex);
}
}
super.visitBinaryExpression(expr);
}
});
System.out.println("after " + stmt.toString());
这不是一个完整的解决方案,因为您还必须检查正确的表达式。由于您确实无法修改二进制表达式 a > 1 本身,因此您必须查找封闭的表达式并将其替换在那里。这就是主要思想。
顺便说一句,这是这个小片段的输出:
before SELECT * FROM a WHERE a > 1 AND b < 1 AND c = 3
after SELECT * FROM a WHERE 1 = 1 AND b < 1 AND c = 3