Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 灵活有效地组合查询条件_Postgresql_Scala_Slick_Slick 3.0 - Fatal编程技术网

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 }