[英]Slick Combining query conditions effeciently
我有兩個表,我想每次都運行這個查詢。
def query(host: String, id: String, key: String, map: Map[String, List[String]) =
{
val query = (for {
t1 <- TableQuery[TableA]
t2 <- TableQuery[TableB]
if t1.host === host &&
(t2.host === host) &&
(t1.id === t2.id)
} yield
t2.name)
.result
db.run(query)
}
當主機不是我的主機時,請按原樣執行上述功能。
但是只想在 t1.host == 'my-host' 時添加額外的檢查,然后檢查 key 是否存在於地圖中,如果是,則在地圖值中添加條件 t1.class。
我想要這樣的東西:
t1 <- TableQuery[TableA]
t2 <- TableQuery[TableB]
if t1.host === host &&
t1.host === 'my-host'
(t2.host === host) &&
(t1.id === t2.id) &&
t1.value inSet map(key)
else if t1.host === host &&
(t2.host === host) &&
(t1.id === t2.id)
我不確定您是要為這兩種情況構造不同的查詢,還是編寫一個處理這兩種情況的 SQL 查詢。
如果是單個查詢,我建議寫出您期望的 SQL,然后應該可以將其映射到filter
(用於理解if
)
但我猜你想根據host
的情況構建一個不同的查詢。 在這種情況下,我建議的模式是:
(需要注意的一件事是了解 SQL(在數據庫中)發生了什么,以及在 Scala 中(在客戶端)發生了什么。例如,在你說“我想要這樣的東西:”的地方你有困難,因為在里面-理解你已經在數據庫領域了。在 SQL 中使用條件邏輯可能是可能的,但我認為這不是你正在尋找的)。
舉一個簡單的例子,你可以構造一個這樣的基本查詢:
val baseQuery = for {
t1 <- TableQuery[TableA]
t2 <- TableQuery[TableB]
if t1.host === host && t2.host === host && t1.id === t2.id
} yield (t1, t2)
然后使用它來創建一個新查詢來處理特殊情況:
val queryAllowingForMyHost =
baseQuery.filterIf(host == "my-host") {
case (t1, t2) => t2.host inSet Seq("x", "y", "z")
}
我在那里使用過query.filterIf
,但您可以(如果您願意)編寫常規 Scala:
val queryAllowingForMyHost =
if (host == "my-host") {
baseQuery.filter( /* extra conditions here */ )
} else {
baseQuery
}
最后,在運行之前為查詢添加任何收尾工作:
val query = queryAllowingForMyHost.map { case (t1, t2) => t2.name }
這就是您要運行的查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.