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

技术求助:将指定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:35:16