mySQL to PostgreSQL concat名字搜索的名字和姓氏(Ruby on Rails)

时间:2012-06-27 04:31:44

标签: mysql ruby-on-rails ruby-on-rails-3 postgresql

嘿我正在试图弄清楚如何将在mySQL中运行的语句转换为PostgreSQL,如果有人知道解决方案,那就很好奇。

这是在mySQL中有效的语句:

def self.by_name(keywords)
    if keywords
        find(:all, :conditions => ["concat(first_name," ",last_name) like?", "%#{keywords}%"])

    end
  end

这是我在this site上发现的基本上有类似问题的陈述,但它对我不起作用,如果我进行像Contact.by_name(“Bobby”)这样的搜索,没有结果。

def self.by_name(keywords)
    if keywords
        find(:all, :conditions => ["textcat(textcat(first_name,text ' '),last_name) like?", "%#{keywords}%"])
    end
  end

我的想法是,我可以搜索“Bobby”,“Fishcer”或“Bobby Fischer”,它可以匹配任何人的名字,姓氏或名字和姓氏。谢谢!

1 个答案:

答案 0 :(得分:5)

您可以使用concatenation operator (||)将所有内容粘贴在一起:

:conditions => [
  "coalesce(first_name, '') || ' ' || coalesce(last_name, '') ilike '%' || ? || '%'",
  keywords
]

您还会注意到我从字符串插值"%#{keywords}%"切换到SQL '%' || ? || '%'中的字符串连接,以构建搜索模式;这样做可以避免注射和引用问题。我也已切换到ilike,因为你可能想要一个不区分大小写的搜索。