如何使用uuid搜索数据库?

时间:2017-10-18 12:56:17

标签: postgresql elixir ecto

我在postgresql中使用phoenix-framework。

为了实现搜索功能,我使用了ilike ecto查询,所有搜索功能都可以正常工作。例如,我有一个搜索带产品名称的产品的功能,效果很好。

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查询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查询进行搜索?如果是的话,我在这里做错了什么?

提前谢谢你。

1 个答案:

答案 0 :(得分:2)

我假设你想在UUID的十六进制表示中进行子字符串搜索(例如"%a%"应该匹配且"%e%"不匹配015cd1d7-2794-4247-a24f-16b84ca9a3ac)。您可以通过将UUID值显式转换为text然后执行ilike来执行此操作:

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

(我还删除了搜索字符串周围的一组冗余括号。)