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」、「Fischer」、または「Bobby Fischer」を検索でき、その名、姓、または名と姓の両方を持つすべての人に一致するというものです。ありがとう!

4

1 に答える 1

6

連結演算子 ( ||)を使用して、すべてを貼り付けることができます。

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

検索パターンを構築するために"%#{keywords}%"、SQL で文字列補間 から文字列連結 に切り替えたことにも気付くでしょう。'%' || ? || '%'これを行うと、インジェクションと引用の問題が回避されます。ilikeおそらく大文字と小文字を区別しない検索が必要なので、私もに切り替えました。

于 2012-06-27T05:12:05.543 に答える