2013-07-01 107 views
16

例如,我想創建以下查詢:是否可以在普通的sql Slick中使用IN子句?

SELECT c.* FROM Coffees c WHERE c.name IN ('robusta', 'arabica') 

我的嘗試失敗:

val cnames = List("robusta", "arabica") 
sql""" SELECT c.* FROM Coffees c WHERE c.name IN ${cnames} """ 
    could not find implicit value for parameter pconv: 
    scala.slick.jdbc.SetParameter[List[String]] 

是否有可能以某種方式使用in子句中Slick普通的SQL查詢?

+0

最讓我困惑的是,在Slick's提升嵌入,這幾乎是一個毫不費力的任務。 – Rogach

回答

3

我沒有看到任何開箱即可處理此問題。你最好的選擇可能是這樣的:

val cnames = List("robusta", "arabica").map("'" + _ + "'").mkString(",") 
val query = sql""" SELECT c.* FROM Coffees c WHERE c.name IN (${cnames}) """ 
+0

@Rogarch,因爲事情發生了變化,我的答案不再正確,請你將接受的答案改爲下面的答案,以便我可以刪除這個答案? – cmbaxter

+1

這將工作,如果插值使用#$而不是$,但它仍然非常不安全。 :) http://slick.typesafe.com/doc/2.1.0/sql.html'scala> sqlu「」「update tbl_foo set x = 1 where y in#$ z」「」 res30:scala.slick。 jdbc.StaticQuery [Unit,Int] = scala> res30.getStatement res31:String =「update tbl_foo set x = 1 where y in(1,2)」 '(抱歉,我不知道如何格式化很好,當我不能插入返回) – qu1j0t3

+1

不太熟悉浮油,但是這不會引入SQLi漏洞?或者它是由'sql' quasiquote處理的? –

2

儘管這不是SQL注入安全,你可以使用#$插值器:

val ids = idList.map("'" + _ + "'").mkString(",") 
val q = sql"""select name from mytable where id in (#$ids)""" 
相關問題