使用Ecto查询对{j}列中的字段求和

时间:2017-11-13 14:20:47

标签: postgresql elixir ecto

假设我在Postgres数据库中有一个 jsonb 类型列,名为 info 。其中一个字段是字节,它在信息字段中以整数形式存储。

如果我尝试对 info =>的值求和Ecto查询中的字节字段,如下所示:

total_bytes = Repo.one(from job in FilesTable,
  select: sum(fragment("info->>'bytes'")))

我收到错误函数sum(text)不存在

有没有办法编写上面的查询,以便 info => bytes 可以求和,还是只需要从数据库中的每一行中选择该字段,然后使用Elixir来加总值?

1 个答案:

答案 0 :(得分:1)

错误消息表明它无法sum文本字段。您需要将字段显式地转换为整数,以便sum起作用。

此外,在fragment中对列名称进行硬编码也不正确。它只适用于这种情况,因为您只从一个表中进行选择。如果你有一些连接语句与其他具有相同列名的表,查询将无法工作。您可以在字符串中使用?,然后将该列作为参数传递。

这是最后应该起作用的事情:

sum(fragment("(?->>'bytes')::integer", job.info)))