使用 Ecto 查询对 jsonb 列中的字段求和
Sum a field in a jsonb column with an Ecto query
假设我在 Postgres 数据库中有一个 jsonb 类型的列,名为 info。其中一个字段是字节,它作为一个整数存储在信息字段中。
如果我尝试对 Ecto 查询中 info => bytes 字段的值求和,如下所示:
total_bytes = Repo.one(from job in FilesTable,
select: sum(fragment("info->>'bytes'")))
我收到错误消息函数总和(文本)不存在。
有没有一种方法可以编写上面的查询,以便 info => bytes 可以求和,或者我是否只需要 select 每行中的那个字段在数据库中,然后使用 Elixir 将值相加?
错误消息说它不能 sum
文本字段。您需要将该字段显式转换为整数,以便 sum
有效。
此外,在 fragment
中硬编码列名是不正确的。它仅在这种情况下有效,因为您只从一个 table 中进行选择。如果您在其中有一些连接语句与其他 table 具有相同的列名,则查询将不起作用。您可以在字符串中使用 ?
,然后将该列作为参数传递。
这是最后应该起作用的东西:
sum(fragment("(?->>'bytes')::integer", job.info)))
假设我在 Postgres 数据库中有一个 jsonb 类型的列,名为 info。其中一个字段是字节,它作为一个整数存储在信息字段中。
如果我尝试对 Ecto 查询中 info => bytes 字段的值求和,如下所示:
total_bytes = Repo.one(from job in FilesTable,
select: sum(fragment("info->>'bytes'")))
我收到错误消息函数总和(文本)不存在。
有没有一种方法可以编写上面的查询,以便 info => bytes 可以求和,或者我是否只需要 select 每行中的那个字段在数据库中,然后使用 Elixir 将值相加?
错误消息说它不能 sum
文本字段。您需要将该字段显式转换为整数,以便 sum
有效。
此外,在 fragment
中硬编码列名是不正确的。它仅在这种情况下有效,因为您只从一个 table 中进行选择。如果您在其中有一些连接语句与其他 table 具有相同的列名,则查询将不起作用。您可以在字符串中使用 ?
,然后将该列作为参数传递。
这是最后应该起作用的东西:
sum(fragment("(?->>'bytes')::integer", job.info)))