使用动态条件进行简单的SQL查询

Fey*_*yaz 8 scala slick

我正在努力为我的查询添加其他条件.在最简单的形式,我需要的是如下所示:

def findPeople(name: String, maybeSurname: Option[String]) = {
   val sql1 = sql"select * from my_table where name = $name"
   val sql2 = maybeSurname.map( surname => sql"and col2 = $surname" ).getOrElse(sql"")
   val finalSql = sql1 + sql2 // I need this kind of feature
   ...
   ...
}
Run Code Online (Sandbox Code Playgroud)

使用#$可能是一个选项,但是surname不会是绑定变量,这是一个大问题.

小智 7

这是一个关于光滑3.1.x的示例测试

import slick.jdbc.{SQLActionBuilder, SetParameter, PositionedParameters}

object SlickKit {

  implicit class SQLActionBuilderConcat (a: SQLActionBuilder) {
    def concat (b: SQLActionBuilder): SQLActionBuilder = {
      SQLActionBuilder(a.queryParts ++ b.queryParts, new SetParameter[Unit] {
        def apply(p: Unit, pp: PositionedParameters): Unit = {
          a.unitPConv.apply(p, pp)
          b.unitPConv.apply(p, pp)
        }
      })
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后

import SlickKit._
val sql1 =
  sql"""
   select count(*) from idinfo_#$i
    """

val sql2 =
  sql"""
       where source=$source
    """

val sql = sql1 concat sql2

sql.as[Int].head
Run Code Online (Sandbox Code Playgroud)


pum*_*ump 0

我认为绑定变量不是由映射函数解释的。它们由 Slick sql 插值器解释。这就是为什么你的 sql2 将无法获得姓氏值。

如果您需要编写SQL语句,也许您可​​以考虑不使用Plain SQL功能。你可以只做 .filter( .name ==== name ).filter( .col2 === surname) 吗?