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?
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étodoin
varias veces con cada columna por separado, luego combinarlas con el operador&&
para crear el efecto deseado de una cláusulaIN
en pares de columnas. El siguiente fragmento de código muestra cómo se puede lograr esto: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áusulaIN
.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.