2017-10-18 154 views
0

我使用phoenix-framework和postgresql。如何使用uuid搜索數據庫?

爲了實現搜索功能,我使用了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查詢來搜索錯誤?如果是這樣,我在這裏做錯了什麼?

預先感謝您。

回答

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 

(我也刪除冗餘的周圍設置搜索字符串括號。)

+0

是的,這就是我要怎麼搜索。現在我明白爲了使用UUID進行搜索,我需要將其轉換爲「文本」。我只是試過你的解決方案,但它觸發了一個錯誤,「type(p.id(),:text)'不是一個有效的查詢表達式。是否有任何其他方式將其轉換爲文本? –

+0

您能否給編輯過的版本一個試試看?我把'type'切換到'fragment'。很確定這應該工作。 – Dogbert