微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

高效地组合查询条件

如何解决高效地组合查询条件

我有两个表,我想每次都运行此查询

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'时添加其他检查,然后检查映射中是否存在密钥,如果是,则在映射值中添加条件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 }

这就是您要运行的查询。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。