2017-10-18 7 views
0

私はpostgresqlでphoenix-frameworkを使用しています。uuidを使ってデータベースを検索するには?

検索機能を実装するために、ilikeエクトクエリを使用し、すべての検索機能が正常に動作しました。たとえば、商品名で商品を検索する機能があり、うまく機能します。

def item_searh_results(language_id, name) do 
    from(p in ItemLanguage, where: p.language_id == ^language_id 
           and ilike(p.name, ^("%#{name}%")), 
         select: %{id: p.item_id, 
            name: p.name}) |> Repo.all 
end 

私は、モデルを持っているSales、それがその主キーにuuidを使用しています。

ilike上記のようなecto query apiを使用して販売を検索しようとしています。だから私は同様のクエリを作った。

from(p in Sales, where: ilike(p.id, ^("%#{id}%")))|> Repo.all 

しかし、それは** (Postgrex.Error) ERROR 42883 (undefined_function): operator does not exist: uuid ~~* unknown を検索するilikeクエリを使用することが可能であることがエラーを返しますか?もしそうなら、私はここで間違って何をしていますか?

ありがとうございます。

答えて

2

UUIDの16進数表現で部分文字列検索を行うことを前提としています(たとえば、"%a%"は一致し、"%e%"015cd1d7-2794-4247-a24f-16b84ca9a3acと一致しません)。明示的textにUUID値を変換してilikeをすることによってこれを行うことができます。

from(p in Sales, where: ilike(fragment("?::text", p.id), ^"%#{id}%")) |> Repo.all 

を(私はまた、検索文字列の周りに括弧の冗長セットを削除しました。)

+0

はい、私は検索する方法をthatsの。今私は、UUIDで検索するために、それを 'text'に変換する必要があることを理解しています。私はあなたのソリューションを試しましたが、 'type(p.id()、:text)'は有効なクエリ式ではありません。テキストに変換する方法はありますか? –

+0

編集したバージョンを試してみてください。私は 'type'を' fragment'に切り替えました。これはうまくいくはずです。 – Dogbert