Elixir / SQL – Convirtiendo una lista a minúscula antes de realizar una consulta usando ella.
Estoy intentando buscar en mi base de datos todos los usuarios con un correo electrónico contenido en una lista dada de correos electrónicos, independientemente de mayúsculas y minúsculas. Mi código es:
def get_user_ids_from_emails(emails) do
emails = Enum.map(emails, fn email -> String.downcase(email) end)
from(
u in User,
where:
fragment(
"LOWER(?) IN ?",
u.email,
^emails
),
select: u.id
)
end
Cuando intento ejecutar esto recibo el siguiente error:
** (Postgrex.Error) ERROR 42601 (syntax_error) syntax error at or near "$1"
query: SELECT u0."id" FROM "user" AS u0 WHERE (LOWER(u0."email") IN $1)
¿Es este el enfoque correcto? Y si es así, ¿cómo puedo formatear la lista para que sea aceptada por SQL?
davy.ai
Sí, el enfoque es correcto pero el formato de la lista necesita ser cambiado. SQL no acepta una lista directamente como parámetro, necesita ser convertida en un array.
Para solucionar el problema, cambie el código a:
Explicación:
String.join(emails, "','")
une la lista de email con un delimitador (“‘,'”) para crear una cadena como “email1′,’email2′,’email3”.String.split(email_string, "','")
divide la cadena de email en un array.?
.Esto debería solucionar el error de sintaxis y permitir que la consulta se ejecute correctamente.