【问题标题】:Separate NULL from non existence将 NULL 与不存在分开
【发布时间】:2013-12-24 13:50:03
【问题描述】:

我有一个选择代码:

val requestId = 123
DB.withConnection { implicit con =>
  SQL("SELECT my_field FROM my_table WHERE some_id = {request_id}").onParams(requestId)()
   .collect {
      case Row(myField: Option[String]) =>
        myField match {
          case Some(x) =>
            // ???   

          case None => //there is no such a record?
         }
      }
  }

my_field 可以是NULL。因此有 3 个选项:

  1. WHERE some_id = request_id 记录不存在
  2. 记录 WHERE some_id = request_id 存在并具有值
  3. 记录WHERE some_id = request_id存在并且是NULL

如何区分 1 和 3?

【问题讨论】:

  • 当行不存在时是否收集甚至迭代?
  • 不,不会有行,所以 collect 将返回一个空列表/序列或它返回的任何内容。
  • @SteveSowerby,在什么情况下?

标签: scala playframework anorm


【解决方案1】:

自从我加入 Slick 潮流以来,我对 Anorm 的经验有限,但我认为您可以这样区分您的案例(按顺序):

  1. 你会得到一个空集合。
  2. 您会收到 Some 回复。
  3. 您会收到 None 回复。

所以我猜你是这样匹配的:

        myField match {
          case Seq() => //the record doesn't exist
          case Some(x) => //unpack x because you found something    
          case None => //the record exists but some_id = NULL
         }

查看 Anorm 文档,了解您返回的集合类型。 List 确实实现了 Seq 特征。

【讨论】:

  • 我应该在myField match 返回什么?
  • 应该是case Row(myField: Option[String]) => myField
  • 查看我的编辑。如果不是一路走来,希望它能让你真正接近。再说一次,我不是 Anorm 的家伙。
  • 请看这里stackoverflow.com/questions/20768272/…这是我卡住的地方。
猜你喜欢
  • 1970-01-01
  • 2012-03-29
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-25
  • 2012-09-06
  • 1970-01-01
相关资源
最近更新 更多