在方解石中如何用另一个sqlNode修改生成的SQLNode?
in calcite how to modify the generated SQLNode with another sqlNode?
如果我有一个从 sql
解析的 SqlNode node
select id, age from student where id > 5
,我还有另一个 SqlNode subNode 从另一个子条件
解析
id < 20
然后,如何合并这两个以便我可以得到一个从 sql
解析出相同结果的 SqlNode
select id, age from student where id > 5 and id < 20
我可以将子节点追加到node中SqlSelect的where属性吗?可能一开始我可以附加子条件,但在更复杂的情况下,使用正则表达式会非常困难。
对于AND
运算符,可以使用SqlUtil.andExpressions
来组合两个条件,如下:
SqlUtil.andExpressions(con1, con2);
此外,您可以使用 SqlStdOperatorTable.AND
构建 AND
表达式:
// list contains the operators, such as id > 5 and id < 20
SqlStdOperatorTable.AND.createCall(SqlParserPos.ZERO, list)
对于简单的情况,它解决得很好。但是,对于更复杂的情况,如果有嵌套查询,条件应该放在正确的位置,我们应该遍历基本的 SqlNode
并将额外的条件附加到正确的位置。
创建一个class extends SqlBasicVisitor
,覆盖visit
方法来做这个,主要是visit(SqlCall call)
和visit(SqlNodeList nodeList)
的部分应该被覆盖。
如果我有一个从 sql
解析的 SqlNode nodeselect id, age from student where id > 5
,我还有另一个 SqlNode subNode 从另一个子条件
解析id < 20
然后,如何合并这两个以便我可以得到一个从 sql
解析出相同结果的 SqlNodeselect id, age from student where id > 5 and id < 20
我可以将子节点追加到node中SqlSelect的where属性吗?可能一开始我可以附加子条件,但在更复杂的情况下,使用正则表达式会非常困难。
对于AND
运算符,可以使用SqlUtil.andExpressions
来组合两个条件,如下:
SqlUtil.andExpressions(con1, con2);
此外,您可以使用 SqlStdOperatorTable.AND
构建 AND
表达式:
// list contains the operators, such as id > 5 and id < 20
SqlStdOperatorTable.AND.createCall(SqlParserPos.ZERO, list)
对于简单的情况,它解决得很好。但是,对于更复杂的情况,如果有嵌套查询,条件应该放在正确的位置,我们应该遍历基本的 SqlNode
并将额外的条件附加到正确的位置。
创建一个class extends SqlBasicVisitor
,覆盖visit
方法来做这个,主要是visit(SqlCall call)
和visit(SqlNodeList nodeList)
的部分应该被覆盖。