- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 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/
我想从查询和子查询中获取所有选择的项目 根据此链接,https://stackoverflow.com/a/30505741/8249665我可以从主查询中获取选定的项目。 对于这样的子查询 - “S
以下字符串: x=92 and y=29 产生有效的输出:x=92 AND y=29并且它与CCJSqlParserUtil.parseCondExpression一起工作正常,但它不应该抛出以下异常
假设我有一个格式表达式 a>10 and b>20 and c>30 我想得到如下的表达式列表 a>10 b>20 c>30 如果我使用表达式访问者模式,对于 AndExpression 访问者,我写
我刚刚开始探索 JSqlparser。根据我的理解,我修改了 TablesNamesFinder 以提取列和表,它工作正常但有一个非常小的问题。 @Override public void visit
我想向我的 sql 添加新条件。例如如果查询是; SELECT EMP_ID, FIRST_NAME FROM EMPLOYEES; 我可以用这个代码添加新的 where 原因; @Override
我正在尝试找到从使用 JSQLParser 解析的查询中删除表达式(例如条件)的最简单方法。 假设我有以下查询(这里没有真正的逻辑): select a,b,c from table where a
我将 jar jsqlparser-0.7.0 添加到我的 Netbeans IDE(右键单击库/添加 Jar 文件)但我仍然无法使用它的包。可能是什么原因 。该库创建于 2011 年,可能是 JDK
当使用 JSqlParser 解析查询时,在某些情况下,JSqlParser 似乎决定生成 SubJoin 对象作为 FromItem,而不是常规的 Table/Join 对象。 您能帮我了解这种情况
我正在编写一个 SQL 查询评估器,并使用 JSQLParser 来解析查询。现在看来(并且此链接 http://sourceforge.net/p/jsqlparser/feature-reques
我已经开始使用 JSqlParser,我可以解析 Where 子句,但我无法进一步使用它。 JSqlParser github link 事实上,我已经尝试过重写访问方法,但不明白如何实现我的目标。
我想使用 JSqlParser 完整而简洁地解析 SQL where 子句。很容易将它解析成像这样的单独的条件语句 String whereClause = "a=3 AND b=4 AND c=5"
JSqlParser 中是否有任何选项可以解析查询,例如 create table public.sales1 as (select * from public.sales) 最佳答案 我假设您使用旧
我正在使用 JsqlParser 0.8.0。 我有以下字符串: String sql = "SELECT table alias FROM table;"; CCJSqlParserManager
我想知道是否可以使用 jsqlparser 将表达式添加到 sql 查询中。例如,我想在 sql 语句中添加一个列和一个值: 原始查询:“INSERT INTO frontend(in_reply_t
我正在尝试使用 JSqlParser 在 SQL 查询中查找 SQL 对象( token ?)的位置(行就足够了)。 例如,在查询中: SELECT a FROM table WHERE a = 1
我想获取 from 子句中的所有子查询,但是当我使用时 FromItem fromItems = plainSelect.getFromItem(); 它只是检索 from 子句中的第一个子查询以及
如何使用 JSQLParser 区分函数调用和字段名称? 例如,查询 SELECT COUNT(*) FROM db.table 将 COUNT(*) 解析为字段名称而不是函数调用。 我需要做什么来更
我正在使用 JSqlParser 3.0,我的查询是 SELECT * from [dev-testdb].dbo.EMPLOYEES 。我正在尝试删除 [] 字符,因为 JSqlParser 3.0
【现象】 2022-07-25 11:59:51.707 [http-nio-7006-exec-3] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - [log
我是一名优秀的程序员,十分优秀!