假设我在Postgres数据库中有一个 jsonb 类型列,名为 info 。其中一个字段是字节,它在信息字段中以整数形式存储。
如果我尝试对 info =>的值求和Ecto查询中的字节字段,如下所示:
total_bytes = Repo.one(from job in FilesTable,
select: sum(fragment("info->>'bytes'")))
我收到错误函数sum(text)不存在。
有没有办法编写上面的查询,以便 info => bytes 可以求和,还是只需要从数据库中的每一行中选择该字段,然后使用Elixir来加总值?
答案 0 :(得分:1)
错误消息表明它无法sum
文本字段。您需要将字段显式地转换为整数,以便sum
起作用。
此外,在fragment
中对列名称进行硬编码也不正确。它只适用于这种情况,因为您只从一个表中进行选择。如果你有一些连接语句与其他具有相同列名的表,查询将无法工作。您可以在字符串中使用?
,然后将该列作为参数传递。
这是最后应该起作用的事情:
sum(fragment("(?->>'bytes')::integer", job.info)))