Solo quiero ejecutar una consulta Ecto con una concatenación simple de dos o más columnas.
Creo que el siguiente pseudocódigo de elixir ya muestra lo que intento hacer:
customers = Customer.undeleted( from c in Customer, select: %{id: c.id, name: c.name <> " – " <> c.street}, order_by: c.name ) |> Repo.all Me vuelve loco porque en SQL es fácil así: ...SELECT c.id, concat(c.name, ' - ', c,street) AS name
¿Alguna idea de cómo resolver esto con ecto querys?
No puede usar <> en una expresión seleccionada en Ecto. Si quieres llamar a concat así, puedes usar fragment :
select: %{id: c.id, name: fragment("concat(?, ' - ', ?)", c.name, c.street)},Para agregar a la respuesta de @Dogbert, puede limpiar un poco el código colocando el fragmento de la función SQL en una macro personalizada como se describe en los documentos :
defmodule CustomSQLFunctions do defmacro concat(left, mid, right) do quote do fragment("concat(?, ?, ?)", unquote(left), unquote(mid), unquote(right)) end end endLuego importe para usar en la consulta
import CustomSQLFunctions customers = Customer.undeleted( from c in Customer, select: %{id: c.id, name: concat(c.name, ' - ', c.street)}, order_by: c.name ) |> Repo.all