[英]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.