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

时间:2015-09-30 08:51:35

标签: 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
   ...
   ...
}

使用#$可能是一个选项,但是姓氏不会是绑定变量,这是一个很大的问题。

2 个答案:

答案 0 :(得分:6)

这是一个关于光滑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)
        }
      })
    }
  }
}

然后

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

答案 1 :(得分:0)

我认为绑定变量不是由map函数解释的。它们由Slick sql插值器解释。这就是为什么你的sql2不会获得姓氏值的原因。

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