如何解决高效地组合查询条件
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 举报,一经查实,本站将立刻删除。