Scala Slick:选项列过滤

Scala Slick:选项列过滤,scala,slick,slick-2.0,Scala,Slick,Slick 2.0,我想做一些类似的事情(这是一个虚构的例子来简化我的实际问题): 由于最后一个“true”,因此无法编译。有更好的方法吗?您必须将其设置为列[Boolean]: def findByGender(isMale: Option[Boolean]) = { People.filter(row => row.name.isNotNull && isMale match { case Some(true) => row.wife.isNotNull //

我想做一些类似的事情(这是一个虚构的例子来简化我的实际问题):


由于最后一个“true”,因此无法编译。有更好的方法吗?

您必须将其设置为
列[Boolean]

def findByGender(isMale: Option[Boolean]) = {
  People.filter(row => row.name.isNotNull && isMale match {
    case Some(true) => row.wife.isNotNull      // find rows where wife column is not null
    case Some(false) => row.wife.isNull        // find rows where wife column is null
    case None => LiteralColumn(true)           // select everything
  })    
}

如果您使用的是Slick 3.3.x,则可以使用以下解决方案:

def findByGender(isMale: Option[Boolean]) = 
  People
    .filter(_.name.isDefined)
    .filterIf(isMale == Some(true))(_.wife.isDefined)
    .filterIf(isMale == Some(false))(_.wife.isEmpty)

有3种情况:

  • isMale
    已定义且等同于
    Some(true)

    结果SQL:
    select*from people when(姓名不为空)和(妻子不为空)

  • isMale
    已定义且等同于
    Some(false)

    结果SQL:
    select*from people when(姓名不为空)和(妻子为空)

  • isMale
    为空

    结果SQL:
    select*from people,当name不为null时


  • 你觉得这个怎么样?我甚至找不到任何关于
    LiteralColumn
    的内容,也不知道我在哪里找到的。那是很久以前的事了。
    def findByGender(isMale: Option[Boolean]) = 
      People
        .filter(_.name.isDefined)
        .filterIf(isMale == Some(true))(_.wife.isDefined)
        .filterIf(isMale == Some(false))(_.wife.isEmpty)
    
    def findByGender(isMale: Option[Boolean]) = 
      People
        .filter(_.name.isDefined)
        .filterOpt(isMale) {
          case (row, true) => row.wife.isDefined
          case (row, false) => row.wife.isEmpty
        }