You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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的执行顺序:

  1. scan(index):对应FROM 表,扫描指定的表/索引
  2. filter(condition):对应WHERE 条件,过滤数据
  3. project(fields):对应SELECT 字段列表,投影指定字段

你可以根据需求调整操作顺序,但建议先过滤再投影,减少后续处理的数据量。

内容的提问来源于stack exchange,提问作者Vincent Carter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:34:19