繁体   English   中英

JsqlParser如何重写表达式

[英]JsqlParser how to rewrite a expression

我有一个 sql ,其中包括:

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 本身,因此您必须查找封闭表达式并在那里替换它。 这就是主要思想。

顺便说一句,这是这个小片段的 output:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM