gpt4 book ai didi

scala - 有条件地将可为空字段映射到 Slick 中的 None 值

转载 作者:行者123 更新时间:2023-12-02 04:24:28 25 4
gpt4 key购买 nike

在 Slick 2.1 中,我需要执行查询/map 操作,在该操作中,如果可空字段包含某个非空值,则将其转换为 None。不确定这是否重要,但就我而言,有问题的列类型是映射列类型。这是一个代码片段,试图说明我正在尝试做的事情。它不会编译,因为编译器不喜欢 None

case class Record(field1: Int, field2: Int, field3: MyEnum)

sealed trait MyEnum
val MyValue: MyEnum = new MyEnum { }

// table is a TableQuery[Record]
table.map { r => (
r.field1,
r.field2,
Case If (r.field3 === MyValue) Then MyValue Else None // compile error on 'None'
)
}

错误是这样的:

type mismatch; found : None.type required: scala.slick.lifted.Column[MyEnum]

实际上,我想这样做的原因是我想执行一个groupBy,其中我计算field3包含给定值的记录数。我无法让更复杂的 groupBy 表达式工作,所以我退回到这个更简单的示例,但我仍然无法工作。如果有更直接的方法来显示 groupBy 表达式,那也很好。谢谢!

更新

我尝试了@cvogt建议的代码,但这会产生编译错误。这是SSCCE万一有人能发现我在这里做错了什么。编译失败并显示“值?不是 Int 的成员”:

import scala.slick.jdbc.JdbcBackend.Database
import scala.slick.driver.H2Driver

object ExpMain extends App {

val dbName = "mydb"
val db = Database.forURL(s"jdbc:h2:mem:${dbName};DB_CLOSE_DELAY=-1", driver = "org.h2.Driver")
val driver = H2Driver

import driver.simple._

class Exp(tag: Tag) extends Table[(Int, Option[Int])](tag, "EXP") {
def id = column[Int]("ID", O.PrimaryKey)
def value = column[Option[Int]]("VALUE")
def * = (id, value)
}
val exp = TableQuery[Exp]

db withSession { implicit session =>
exp.ddl.create

exp += (1, (Some(1)))
exp += (2, None)
exp += (3, (Some(4)))

exp.map { record =>
Case If (record.value === 1) Then 1.? Else None // this will NOT compile
//Case If (record.value === 1) Then Some(1) Else None // this will NOT compile
//Case If (record.value === 1) Then 1 Else 0 // this will compile
}.foreach {
println
}
}

}

最佳答案

I need to perform a query/map operation where I convert a nullable field to None if it contains a certain non-null value

鉴于您在更新中拥有的示例数据,并假设 1 是您关心的“特定”值,我相信这是您期望的输出:

None, None, Some(4)

(对于 ID 为 1、2 和 3 的行)

如果我正确理解了问题,这就是您所需要的......?

val q: Query[Column[Option[Int]], Option[Int], Seq] = exp.map { record => 
Case If (record.value === 1) Then (None: Option[Int]) Else (record.value)
}

...相当于:

select (case when ("VALUE" = 1) then null else "VALUE" end) from "EXP"

关于scala - 有条件地将可为空字段映射到 Slick 中的 None 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28122151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com