簡體   English   中英

Slick 高效組合查詢條件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM