Stream,Option上的模式匹配和创建元组

时间:2013-12-25 01:16:24

标签: postgresql scala playframework anorm

我有一张表table1

id: Int
externalId: Int
value: String

对于给定的externalId value,可以是NULL,也可能根本不存在。我想根据这个条件返回一个元组:

  1. 如果它不存在,则返回("notExists", Nil)
  2. 如果它存在但NULL则返回("existsButNull", Nil)
  3. 如果它存在而不是NULL,则返回("existsWithValue", ???)
  4. 其中???应为所有具有给定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的模式匹配有关,但我无法弄清楚如何做到这一点。

1 个答案:

答案 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))
}