2013-12-24 2 views
1

I, имеющий код, который делает выбор:Отдельный NULL из небытия

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?

+0

Собирает ли даже итерацию по ряду, если она не существует? –

+0

Нет, строк не будет, поэтому collect вернет пустой список/seq или что-то еще, что он возвращает. –

+0

@SteveSowerby, в каком случае? –

ответ

1

У меня есть только ограниченный опыт Anorm, так как я прыгнул на подножку Slick, но я думаю, что вы различать среди ваших дел таким образом (в порядке убывания):

  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.

+0

Что мне следует возвращать в 'myField match'? –

+0

должно быть 'case Row (myField: Option [String]) => myField'? –

+0

См. Мое редактирование. Надеюсь, вам станет очень близко, если не на всем пути. Опять же, я не чувак Anorm. – Vidya

Смежные вопросы