如果第一个条件不匹配,如何使用第二个条件选择行

时间:2017-11-01 07:40:35

标签: sql ruby-on-rails postgresql

我有一个模型Post,其中包含textpointcreated_at列。

要获得包含文字foopoint的前3个帖子超过20

scope :foo_or_good_point, -> {
  where(<<-SQL)
    text LIKE '%foo%' OR point >= 20
  SQL
}

如果该行不存在,请使用最近的3个帖子。

def self.foo_or_good_point_or_recent
  return foo_or_good_point.first(3) if foo_or_good_point.exists?
  order(created_at: :desc).first(3)
end

上面的代码运行正常。但是有多个SQL调用。 我可以用单个SQL编写此行为吗?

环境

  • PostgreSQL 9.6.3

1 个答案:

答案 0 :(得分:0)

我认为可以使用像这样的

这样的SQL查询来解决它
select *
from Post
where text LIKE '%foo%' OR point >= 20
  union all
select *
from Post
where not exists(select 1 from Post where text LIKE '%foo%' OR point >= 20) 
order by created_at desc
limit 3