我正在使用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
答案 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.title
为NULL
时会有效。如果它可以是空白字符串,则可以使用CASE
语句。
PS也许你应该使用LEFT JOIN
表父母而不是包括它。