光滑的条件和(scala)

Conditional sum in slick (scala)

我正在尝试将以下 SQL 重写为 slick:

SELECT id
SUM(
 if (spend > 0, 1, 0)
)
FROM items
GROUP by id

我当前的代码与此类似:

items.groupBy(r => r.id).map {
  case (id, group) => (id, group.map { r => if (r.spend > 0) 1 else 0 }.sum)
}

但是我得到了以下错误:

polymorphic expression cannot be instantiated to expected type; found : [R]slick.lifted.Rep[R] required: Boolean

我也尝试过使用 filterlength,但没有成功。我怎样才能实现我的目标?

无法将 Scala 三元表达式转换为流畅的语法。

最简单的方法就是将这里的查询简化为

SELECT COUNT(id)
FROM items
WHERE spend > 0
GROUP by id

对应的slick会是

items.filter(_.spend > 0).groupBy(_.id) map {
      case (id, group) => (id, group.size)
    }

或者您可以尝试使用 SimpleFunction:

访问 if 函数
def ifFun[T] = SimpleFunction.ternary[Boolean, T, T, T]("if")

items.groupBy(_.id) map {
  case (id, group) => (id, group.map(r => ifFun(r.spend > 0, 1, 0)).sum)
}

Slick 已经为此提供了解决方案 (documentation):

items.groupBy(r => r.id).map {
  case (id, group) => (id, group.map { r => 
    Case If r.spend > BigDecimal(0.0) Then 1 Else 0 
  }.sum)
}