2017-10-18 2 views
0

Ich benutze phoenix-framework mit postgresql.Wie Datenbank mit uuid suchen?

Für die Implementierung der Suchfunktion verwendete ich ilike ecto Abfrage und alle Suchfunktionen funktionieren gut. Zum Beispiel habe ich eine Funktion zum Suchen von Produkten mit Produktnamen und es funktioniert gut.

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 

Ich habe ein Modell, Sales und verwendet uuid für seine Primärschlüssel.

Ich versuche, Verkäufe zu suchen, indem ich ilike ecto Query API wie oben Funktion verwende. Also habe ich eine ähnliche Abfrage gemacht.

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

Aber es gibt einen Fehler, dass ** (Postgrex.Error) ERROR 42883 (undefined_function): operator does not exist: uuid ~~* unknown Ist es möglich, ilike Abfrage zu verwenden, um zu suchen? Wenn ja, was mache ich hier falsch?

Vielen Dank im Voraus.

Antwort

2

Ich gehe davon aus Sie eine Teil Suche in der Hex-Darstellung eines UUID tun möchten (z "%a%" sollten übereinstimmen und "%e%" für 015cd1d7-2794-4247-a24f-16b84ca9a3ac nicht entsprechen sollte). Sie können dies tun, indem sie ausdrücklich die UUID Wert text Umwandlung und dann tun ilike:

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

(ich auch einen redundanten Satz von Klammern um den Suchtext entfernt.)

+0

Ja, das ist, wie ich suchen möchten . Jetzt verstehe ich, dass, um mit UUID zu suchen, ich es in 'Text' konvertieren muss. Ich habe gerade Ihre Lösung versucht, aber es löst einen Fehler aus, dass 'type (p.id(),: text)' kein gültiger Abfrageausdruck ist. Gibt es eine andere Möglichkeit, ihn in Text umzuwandeln? –

+0

Könnten Sie bitte die bearbeitete Version ausprobieren? Ich habe 'type' in' fragment' umgestellt. Ziemlich sicher, das sollte funktionieren. – Dogbert