es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for 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:

    def get_user_ids_from_emails(emails) do
      emails = Enum.map(emails, &String.downcase/1)
      email_array = String.split(String.join(emails, "','"), "','")
    
      from(
        u in User,
        where:
          fragment(
            "LOWER(?) IN (?)",
            u.email,
            ^email_array
          ),
        select: u.id
      )
    end
    

    Explicación:

    1. String.join(emails, "','") une la lista de email con un delimitador (“‘,'”) para crear una cadena como “email1′,’email2′,’email3”.
    2. String.split(email_string, "','") divide la cadena de email en un array.
    3. El array resultante es pasado como parámetro a la consulta SQL usando el marcador de posición ?.

    Esto debería solucionar el error de sintaxis y permitir que la consulta se ejecute correctamente.

Comments are closed.