用条件字段替换sql select

时间:2014-05-28 18:06:04

标签: sql ruby postgresql

我正在使用postgres。我有一个表继承'listing'表。列表可以有很多变体,通过parent_id属于父级。父母和孩子都有一个“标题”字段。有时候,不幸的是,变体标题是空的,我们需要保持这种方式,因为它反映了原始数据的导入方式,因此进行数据迁移以填充变量。标题与其父标题不是一个选项。

但是当我们在网络视图中显示数据时,我们总是希望显示标题。

我想查询商家的所有商家信息(父母和变体),如果孩子的标题为空,则将null替换为父母的标题。现在我在轨道上的ruby中做这个,这可能很慢,因为它必须遍历每个ruby对象。有没有办法在SQL中执行此操作?

我们现在正在做这样的事情:

listings = Listing
                .includes(:parent)
                .where(:merchant_id => current_merchant.id)
                .where(product_id: params[:ids])
                .select(:type, :id, :sku, :product_id, :title, :quantity, :price,   :channel_id, :status, :state, :parent_id)

#fix blank titles
listings.each do |l|
  next if l.title
  l.title = l.parent.title if l.parent_id
end

1 个答案:

答案 0 :(得分:0)

我认为这是可能的。基于此docs

listings = Listing
            .includes(:parent)
            .where(:merchant_id => current_merchant.id)
            .where(product_id: params[:ids])
            .select('type, COALESCE(listings.title, parents.title), ...)

我认为listings.titleNULL时会有效。如果它可以是空白字符串,则可以使用CASE语句。

PS也许你应该使用LEFT JOIN表父母而不是包括它。