【问题标题】:Sum a field in a jsonb column with an Ecto query使用 Ecto 查询对 jsonb 列中的字段求和
【发布时间】:2017-11-13 14:20:47
【问题描述】:

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

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

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

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

有没有办法编写上面的查询,以便 info => bytes 可以求和,或者我必须从数据库中的每一行中选择该字段,然后使用 Elixir将值相加?

【问题讨论】:

  • fragment("sum(info->>'bytes'))")?
  • (info->>'bytes')::integer
  • 试试sum(fragment("(?->>'bytes')::integer", job.info)))
  • 谢谢@Dogbert 以上是完美的。

标签: postgresql elixir ecto


【解决方案1】:

错误消息说它不能sum 一个文本字段。您需要将该字段显式转换为整数,以便 sum 起作用。

另外,在fragment 中硬编码列名是不正确的。它仅在这种情况下有效,因为您仅从一个表中进行选择。如果您在其中有一些与具有相同列名的其他表的连接语句,则查询将不起作用。您可以在字符串中使用?,然后将该列作为参数传递。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 2015-04-13
    相关资源
    最近更新 更多