光滑的条件和(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
我也尝试过使用 filter
和 length
,但没有成功。我怎样才能实现我的目标?
无法将 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)
}
我正在尝试将以下 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
我也尝试过使用 filter
和 length
,但没有成功。我怎样才能实现我的目标?
无法将 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)
}