Postgresql 灵活有效地组合查询条件
我有两个表,每次都要运行这个查询Postgresql 灵活有效地组合查询条件,postgresql,scala,slick,slick-3.0,Postgresql,Scala,Slick,Slick 3.0,我有两个表,每次都要运行这个查询 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 =
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)
}
def查询(主机:String,id:String,键:String,映射:map[String,List[String])=
{
val查询=(用于{
t1我不确定是否要为这两种情况构造一个不同的查询,或者编写一个处理这两种情况的SQL查询
如果是单个查询,我建议写出您期望的SQL,然后应该可以将其映射到过滤器
(用于理解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)
我在那里使用了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 }
这就是您要运行的查询
val queryAllowingForMyHost =
if (host == "my-host") {
baseQuery.filter( /* extra conditions here */ )
} else {
baseQuery
}
val query = queryAllowingForMyHost.map { case (t1, t2) => t2.name }