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.

Cómo usar `inSet` con una tupla de columnas?

En Slick, podemos usar inSet para una sola columna para realizar la cláusula IN de SQL. Pero no pude descubrir cómo puedo usarlo con un par de columnas.

PostgresQL permite el siguiente uso de IN:
sql
select * from table where (table.a, table.b) in ( values
(1, 'foo'),
(2, 'bar')
)

Pensé que podía hacer lo siguiente en slick pero no compila:
scala
TableQuery[Table].filter(
row => (row.a, row.b) inSet Seq(
(1, "foo"),
(2, "bar"))
)

¿Es posible hacer que funcione?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, en Slick, usar inSet para un par de columnas no es posible directamente. Sin embargo, hay un método alternativo que se puede utilizar. Podemos usar el método in varias veces con cada columna por separado, luego combinarlas con el operador && para crear el efecto deseado de una cláusula IN en pares de columnas. El siguiente fragmento de código muestra cómo se puede lograr esto:

    TableQuery[Tabla].filter(
      fila =>
        fila.a.inSet(Seq(1, 2)) &&
        fila.b.inSet(Seq("foo", "bar"))
    )
    

    Este código crea dos cláusulas IN separadas, una para cada columna, y luego las combina con el operador booleano &&. Esto produce el mismo efecto que la consulta de PostgresQL que usa un par de columnas en la cláusula IN.

    Nota: Este método alternativo puede ser bastante verboso y engorroso para consultas más complejas, por lo que puede ser más eficiente escribir una consulta personalizada utilizando SQL plano en lugar de depender de la API de consultas de Slick.

Comments are closed.