如何在Slick中使用IN子句?

时间:2017-05-26 15:35:24

标签: mysql sql database scala slick

我有一个使用光滑的查询,它不是一个简单的光滑查询。 该查询是一个select查询,它从名为Employee的表中获取记录。结果类型为Employee

现在有一个字符串列表

val nameFilter= List("Sachin","Naveen"")

这个“nameFilter”动态出现,可能有任意数量的名称

var result= dbHandle.db.run((query.drop(10).take(10)).result

变量query只是Employee表的select查询,它选择11到20之间的记录范围。

现在我需要过滤“nameFilter”中提到的名称的记录,然后选择11到20之间的记录。这意味着我需要一个带有“IN”子句的查询。

请注意,这不是一个简单的Slick SQL查询,我必须以上述格式构建查询。

1 个答案:

答案 0 :(得分:7)

您可以使用.inSet方法执行此操作(请参阅here):

  

油滑

     

光滑的查询是可组合的。子查询可以简单地组合,其中类型可以解决,就像任何其他Scala代码一样。

val address_ids = addresses.filter(_.city === "New York City").map(_.id)
people.filter(_.id in address_ids).result // <- run as one query
     

方法.in期望子查询。对于内存中的Scala集合,可以使用 .inSet 方法。

这对您的代码意味着:

val nameFilter= List("Sachin","Naveen")
val filteredQuery = query.filter(_.name.inSet(nameFilter))
var result= dbHandle.db.run((filteredQuery.drop(10).take(10)).result

根据输入的来源,您应该考虑使用 .inSetBind 来转义输入(请参阅this SO post)。