Postgresql 比较值和列时使用平滑过滤器是选项
在Postgres DB(9.3)中有一个表,其中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
formDefinitionId
是可为空的列。Slick版本是2.1.0
我们在查询中使用此筛选器
table.filter(_.formDefinitionId === request.formDefinitionId)
request.formDefinitionId
其中request
只不过是一个Scalacase类
,其中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 = ?;