首页 文章

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

提问于
浏览
8

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

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

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

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

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

相关问题