Postgresql 比较值和列时使用平滑过滤器是选项

Postgresql 比较值和列时使用平滑过滤器是选项,postgresql,scala,slick,Postgresql,Scala,Slick,在Postgres DB(9.3)中有一个表,其中formDefinitionId是可为空的列。Slick版本是2.1.0 我们在查询中使用此筛选器 table.filter(_.formDefinitionId === request.formDefinitionId) request.formDefinitionId其中request只不过是一个Scalacase类,其中formDefinitionId作为选项[Int] case class Request(formDefinitionI

在Postgres DB(9.3)中有一个表,其中
formDefinitionId
是可为空的列。Slick版本是2.1.0

我们在查询中使用此筛选器

table.filter(_.formDefinitionId === request.formDefinitionId)
request.formDefinitionId
其中
request
只不过是一个Scala
case类
,其中
formDefinitionId
作为
选项[Int]

case class Request(formDefinitionId : Option[Int])
现在当
request.formDefinitionId
None
slick生成以下查询

(x2."form_definition_id" = null)
vs

解决方法是根据
请求创建不同的筛选器。formDefinitionId

e、 g

但是,为
选项
的每个属性创建这样的条件是不可行的-在许多表中存在许多
选项
属性。是否有更好的/通用的方法来实现这一点?我想这是一个常见的场景,使用Slick的人没有进行测试(我这里没有Slick设置)

但是当
=null
不返回任何内容时,这样的东西不应该工作吗

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

我是一个新来的滑头,现在也困惑于这个问题。我想用不同的列(选项[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)

您可以在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 = ?;

@恩德纽:不同之处在于研究生的行为。当您在postgres查询中传入的值为NULL时,它将返回结果,其中包含该列为空的行。然而,当query has=null时,query不会返回任何内容抱歉,这是一个愚蠢的问题,我没有意识到实际的区别。您想要
。isEmpty
。当您试图在查询中使用一个真正的空值时,我们可能会抛出一个异常。@szeiger:很抱歉,没有得到您的答案。我想你指的是。我想找一个我贴在火柴里的工作片段?当request.formDefinitionId可以是None或Some(id)时,我仍然不确定如何处理这个“table.filter(u.formDefinitionId===request.formDefinitionId)”。同样在表“formDefinitionId”列中,它是“val formDefinitionId:column[Option[Int]]”-“request.formDefinitionId”是来自模型案例类的值,如我的文章中所述,因此有很多相关的讨论。核心:Slick使用三值逻辑,并且没有一个被解释为false,如果您想要更精确,请使用isEmpty。
 select * from table1 when form_definition_id is null;
 select * from table1 when form_definition_id = ?;