光滑的条件总和(scala)

时间:2015-10-29 19:48:27

标签: sql scala slick

我试图将SQL重写为光滑:

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,但没有成功。我怎样才能实现目标?

2 个答案:

答案 0 :(得分:3)

Scala三元表达式无法转换为光滑的语法。

最简单的方法就是将此处的查询简化为

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

相应的光滑将是

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

或者您可以尝试使用if

来访问SimpleFunction函数
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)
}

答案 1 :(得分:3)

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