2015-09-30 87 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