2015-09-30 55 views
6

我很努力追加附加条件到我的查询。在最简单的形式,我需要的是类似下面的东西:动态条件的简单SQL查询

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 
    ... 
    ... 
} 

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

回答

0

我认为绑定变量不被地图函数解释。它们由Slick sql插入器解释。这就是为什么你的sql2不会得到姓氏值。

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

+0

我的查询比这要复杂得多,这就是为什么我使用普通的SQL。 – Feyyaz

+0

我假设'sql2'是一个部分查询,现在不可能在slick中使用。如果你的意思是'maybeSurname.map',那是'Option',而不是绑定变量。 – Feyyaz

4

这里是光滑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