我试图将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
我还尝试使用filter
和length
,但没有成功。我怎样才能实现目标?
答案 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)
}