Is it possible to use IN clause in plain sql Slick?

前端 未结 4 1717
忘掉有多难
忘掉有多难 2021-01-01 14:16

For example, I want to create the following query:

SELECT c.* FROM Coffees c WHERE c.name IN (\'robusta\', \'arabica\')

My attempt failed:<

相关标签:
4条回答
  • 2021-01-01 14:44

    There is a library that (among other things) introduces a binder for list properties to Slick's SQL interpolator: https://index.scala-lang.org/tarao/slick-jdbc-extension-scala/slick-jdbc-extension

    Example code from the page:

      import util.NonEmpty
    
      def findAll(entryIds: Option[NonEmpty[Long]]): Seq[Entry] = entryIds match {
        case Some(ids) => run { sql"""
        | SELECT * FROM ${table}
        | WHERE entry_id IN $ids
        """.as[Entry] }
        case None => Seq.empty
      }
    
    0 讨论(0)
  • 2021-01-01 14:50

    The type safe "lifted embedding" API supports this as well:

    val ids = List(1,2,3)
    val q = for {
      f <- Foo if f.id inSet ids // ids is not bound
    }
    

    slick.typesafe.com/doc/1.0.1/api/index.html#scala.slick.lifted.ColumnExtensionMethods

    0 讨论(0)
  • 2021-01-01 15:03

    Although it's not safe for SQL injection, you can use #$ interpolator:

    val ids = idList.mkString("'", "','", "'")
    val q = sql"""select name from mytable where id in (#$ids)"""
    
    0 讨论(0)
  • 2021-01-01 15:05

    I don't see anything out of the box to handle this. You're best bet is probably something like this:

    val cnames = List("robusta", "arabica").mkString("'", "','", "'")
    val query = sql""" SELECT c.* FROM Coffees c WHERE c.name IN (${cnames}) """
    
    0 讨论(0)
提交回复
热议问题