比较值和列时的光滑过滤器是选项

时间:2015-10-29 14:43:29

标签: postgresql scala slick

有一个表格,其中uuid在Postgres DB(9.3)中是可为空的列。光滑版本是2.1.0

我们在查询

上有这个过滤器
:uuid

formDefinitionId其中table.filter(_.formDefinitionId === request.formDefinitionId) 只是一个Scala request.formDefinitionIdrequestcase class

formDefinitionId

现在当Option[Int] case class Request(formDefinitionId : Option[Int]) 光滑时会生成以下查询

request.formDefinitionId

VS

None

解决方法是根据(x2."form_definition_id" = null)

创建不同的过滤器

e.g。

(x2."form_definition_id” IS NULL) - this is what Postgres expects

然而,为request.formDefinitionId的每个属性创建这样的条件是不可行的 - 在许多表中存在许多request.formDefinitionId match { case Some(fid) => table.filter(_.formDefinitionId === fid) case None => table.filter(_.formDefinitionId.isNull) } 属性。是否有更好/通用的方法来实现这一目标?我想这是人们使用Slick

的常见情况

3 个答案:

答案 0 :(得分:0)

没有测试(我这里没有Slick设置)。

但由于= null没有返回任何内容,不应该像这样的工作吗?

 table.filter(r => r.formDefinitionId.isNull || r.formDefinitionId === fid)

答案 1 :(得分:0)

您可以对Slick 3.3.x使用以下解决方案:

table
  // case 1: both are empty
  .filterIf(request.formDefinitionId.isEmpty)(_.formDefinitionId.isEmpty)
  // case 2: both are defined and equal
  .filterOpt(request.formDefinitionId)(_.formDefinitionId === _)

情况1对应以下SQL:

 select * from table1 when form_definition_id is null;

情况2:

 select * from table1 when form_definition_id = ?;

答案 2 :(得分:-1)

我是一个更新的光滑,现在也混淆了这个问题。也许它对你来说太过分了。我想用不同的列进行一些搜索(Option [text])。这是我的代码,对我有用。

val someone1 = cou.filter(_.id === id_S)

val someone2 = cou.filter(_.first_name === first)

val someone3 = cou.filter(_.last_name === last)

val someone = (someone1) union (someone2) union (someone3)

dbConfig.db.run(someone.result).map(_.toList)