如何使用RelBuilder创建SELECT和WHERE子句?附代码示例需求
使用RelBuilder创建SELECT和WHERE子句的示例与说明
既然你已经有了基础的scan操作,咱们一步步扩展出SELECT(投影)和WHERE(过滤)的逻辑,直接上代码和解释:
1. 先实现WHERE子句(过滤数据)
假设你要筛选age > 18的记录,用RelBuilder的filter方法就能对应SQL里的WHERE子句。需要先构造一个过滤条件的RexNode:
// 1. 构造WHERE条件:age > 18 RexNode ageFilter = relBuilder.call( SqlStdOperatorTable.GREATER_THAN, relBuilder.field("age"), // 引用表中的age字段 relBuilder.literal(18) // 字面量18 ); // 2. 在scan之后添加filter操作 final RelNode relNodeWithWhere = relBuilder .scan(index) .filter(ageFilter) // 这一步等价于SQL中的WHERE age > 18 .build();
关键点:
filter方法接收一个RexNode类型的条件,用relBuilder.call()可以调用SQL标准操作符(比如GREATER_THAN、EQUALS、AND等)来组合条件。- 如果需要多条件组合,比如
age > 18 AND city = 'Beijing',可以嵌套call:
RexNode ageFilter = relBuilder.call(SqlStdOperatorTable.GREATER_THAN, relBuilder.field("age"), relBuilder.literal(18)); RexNode cityFilter = relBuilder.call(SqlStdOperatorTable.EQUALS, relBuilder.field("city"), relBuilder.literal("Beijing")); RexNode combinedFilter = relBuilder.call(SqlStdOperatorTable.AND, ageFilter, cityFilter);
2. 实现SELECT子句(投影指定字段)
SQL里的SELECT id, name对应RelBuilder的project方法,用来指定要保留的字段:
final RelNode relNodeWithSelect = relBuilder .scan(index) .project( relBuilder.field("id"), // 选择id字段 relBuilder.field("name") // 选择name字段 ) // 这一步等价于SQL中的SELECT id, name .build();
关键点:
- 如果需要给字段加别名,用
as()方法:
.project( relBuilder.field("id").as("user_id"), // 将id重命名为user_id relBuilder.field("name") )
3. 组合SELECT和WHERE子句
实际场景中通常会同时使用过滤和投影,注意顺序(一般先过滤再投影,效率更高):
// 先构造过滤条件 RexNode ageFilter = relBuilder.call(SqlStdOperatorTable.GREATER_THAN, relBuilder.field("age"), relBuilder.literal(18)); // 组合操作:先过滤,再投影指定字段 final RelNode relNodeSelectWhere = relBuilder .scan(index) .filter(ageFilter) // WHERE age > 18 .project( relBuilder.field("id"), relBuilder.field("name"), relBuilder.field("age") ) // SELECT id, name, age .build();
核心逻辑总结
RelBuilder的操作是链式调用,对应SQL的执行顺序:
scan(index):对应FROM 表,扫描指定的表/索引filter(condition):对应WHERE 条件,过滤数据project(fields):对应SELECT 字段列表,投影指定字段
你可以根据需求调整操作顺序,但建议先过滤再投影,减少后续处理的数据量。
内容的提问来源于stack exchange,提问作者Vincent Carter
相关产品推荐
相关产品推荐

