技术求助:将指定SQL语句转换为Arel语法
将给定SQL转换为Arel语法
以下是对应你提供的SQL的Arel实现,适配Oracle的表函数调用场景:
# 定义基础表 fc_low,别名为 F1 fc_low = Arel::Table.new(:fc_low, as: 'F1') # 定义表函数 pg_fg001.fmjc 的调用,包装在 TABLE 函数中并别名 V1 table_function = Arel::Nodes::NamedFunction.new( 'TABLE', [ Arel::Nodes::NamedFunction.new( 'pg_fg001.fmjc', [fc_low[:rowid], Arel::Nodes::NamedFunction.new('trunc', [Arel::Nodes::NamedFunction.new('SYSDATE', [])])] ) ] ).alias('V1') v1 = table_function # 构建 SUM 聚合表达式并别名 case sum_case = Arel::Nodes::NamedFunction.new('sum', [v1[:l_c_v_case]]).as('case') # 构建 WHERE 条件 conditions = Arel::Nodes::And.new([ v1[:fic].eq(Arel.sql('?')), v1[:fiu].eq(Arel.sql('?')), v1[:fst].in(['A', 'B', 'C']), Arel::Nodes::NamedFunction.new('NVL', [v1[:ftm], 0]).not_in([701, 711, 721, 731]) ]) # 组装完整查询 query = fc_low .project(sum_case) .join(table_function, Arel::Nodes::CrossJoin) .where(conditions) # 若需生成SQL字符串,可调用 to_sql # puts query.to_sql
关键说明:
- 原SQL中使用逗号分隔表属于交叉连接,对应Arel中的
Arel::Nodes::CrossJoin - Oracle的表函数调用通过嵌套
Arel::Nodes::NamedFunction实现,外层包装TABLE函数以将函数结果作为关系表使用 Arel.sql('?')用于占位符,实际执行时可传入对应参数- 若在Rails项目中,可替换
Arel::Table.new(:fc_low, as: 'F1')为FcLow.arel_table.alias('F1')(需确保存在对应模型)
内容的提问来源于stack exchange,提问作者Bráulio Lima
相关产品推荐
相关产品推荐

