4

嘿,我想弄清楚如何将在 mySQL 中工作的语句转换为 PostgreSQL,并且好奇是否有人知道解决方案。

这是在 mySQL 中有效的语句:

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

    end
  end

这是我在这个网站上发现的基本上有类似问题的声明,但它对我不起作用,例如,如果我进行像 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”,它会匹配具有该名字、姓氏或同时具有名字和姓氏的任何人。谢谢!

4

1 回答 1

6

您可以使用连接运算符 ( ||)将所有内容粘贴在一起:

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

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

于 2012-06-27T05:12:05.543 回答