我有一张表table1
:
id: Int
externalId: Int
value: String
对于给定的externalId
value
,可以是NULL
,也可能根本不存在。我想根据这个条件返回一个元组:
("notExists", Nil)
NULL
则返回("existsButNull", Nil)
NULL
,则返回("existsWithValue", ???)
其中???
应为所有具有给定value
的记录的externalId
列表。我试着这样做:
DB.withConnection { implicit c =>
SQL("SELECT value from table1 WHERE externalId = 333")
.map { case Row(value: Option[String]) => value }
} match {
case Some(x) #:: xs =>
//????????????
("existsWithValue", ???)
case None #::xs => ("existsButNull", Nil)
case Stream.empty => ("notExists", Nil)
}
请注意,如果值存在且不是NULL
且的记录多于1条,则value
不能为NULL
。例如,这种情况 NOT 可能
1 123 "Value1"
2 123 "Value2"
3 123 NULL -- NOT possible
4 123 "Value4"
它与Stream
+ Option
的模式匹配有关,但我无法弄清楚如何做到这一点。
答案 0 :(得分:3)
流上的模式匹配可能不是一个好主意,我假设返回的元素数量足够小以适应内存?如果元素可能不适合内存,则只能使用流,否则将流转换为列表要容易得多,然后使用列表:
DB.withConnection { implicit c =>
SQL("SELECT value from table1 WHERE externalId = 333")
.map { case Row(value: Option[String]) => value }
.toList
} match {
case Nil => ("notExists", Nil)
case List(None) => ("existsButNull", Nil)
case xs => ("existsWithValue", xs.flatMap(_.toList))
}