繁体   English   中英

在AREL中交叉加入横向

[英]CROSS JOIN LATERAL in AREL

是否可以使用AREL在下面的SQL(PG)查询中获得相同的结果?

SELECT (sd.subscription_data ->> 'id')::uuid FROM events qe
CROSS JOIN LATERAL jsonb_array_elements(subscriptions) AS sd(subscription_data)
WHERE sd.subscription_data ->> 'type' = 'Organization'
AND qe.slug = '#{event_slug}';

是的, 但不是很漂亮

e = Arel::Table.new(:events)
sd = Arel::Table.new(:sd)
event_slug = 'event_slug'

join = Arel::Nodes::NamedFunction.new('json_b_array_elements',
    [Arel::Nodes::SqlLiteral.new("subscriptions")])
      .as(Arel::Nodes::NamedFunction.new('sd',
        [Arel::Nodes::SqlLiteral.new("subscription_data")]).to_sql)


p = e.project(
    Arel::Nodes::SqlLiteral.new(
      Arel::Nodes::Grouping.new(
        Arel::Nodes::InfixOperation.new('->>', 
          sd[:subscription_data], 
          Arel::Nodes::SqlLiteral.new("'id'"))).to_sql) << '::uuid'
).where(
  Arel::Nodes::InfixOperation.new('->>', 
    sd[:subscription_data], 
    Arel::Nodes::SqlLiteral.new("'type'").eq(
      Arel::Nodes::SqlLiteral.new("'Company'")
    )
  ).and(e[:slug].eq(event_slug)))

p.join_sources << Arel::Nodes::StringJoin.new(
    Arel::Nodes::SqlLiteral.new('CROSS JOIN LATERAL')) << join

p.to_sql 

输出是

SELECT 
    ([sd].[subscription_data] ->> 'id')::uuid 
FROM 
    [events] 
    CROSS JOIN LATERAL json_b_array_elements(subscriptions) AS sd(subscription_data)     
WHERE 
    [sd].[subscription_data] ->> 'type' = 'Company' 
    AND [events].[slug] = N'event_slug'"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM