Postgresql 使用EXTO查询对jsonb列中的字段求和
假设我在Postgres DB中有一个名为info的jsonb类型列。其中一个字段是bytes,它作为整数存储在info字段中 如果我尝试将EXTO查询中info=>bytes字段的值相加,如下所示:Postgresql 使用EXTO查询对jsonb列中的字段求和,postgresql,elixir,ecto,Postgresql,Elixir,Ecto,假设我在Postgres DB中有一个名为info的jsonb类型列。其中一个字段是bytes,它作为整数存储在info字段中 如果我尝试将EXTO查询中info=>bytes字段的值相加,如下所示: total_bytes = Repo.one(from job in FilesTable, select: sum(fragment("info->>'bytes'"))) 我得到的错误是函数sum(text)不存在 有没有一种方法可以编写上面的查询,以便对info=>byte
total_bytes = Repo.one(from job in FilesTable,
select: sum(fragment("info->>'bytes'")))
我得到的错误是函数sum(text)不存在
有没有一种方法可以编写上面的查询,以便对info=>bytes进行求和,或者我只需从数据库的每一行中选择该字段,然后使用Elixir将值相加?错误消息说它不能对文本字段求和。您需要将字段显式转换为整数,以便
sum
工作
另外,在片段中硬编码列名是不正确的。它只在这种情况下有效,因为您只从一个表中进行选择。如果其中有一些join语句与具有相同列名的其他表,则查询将无法工作。您可以在字符串中使用?
,然后将列作为参数传递
这是最后一件应该起作用的事情:
sum(fragment("(?->>'bytes')::integer", job.info)))
错误消息说它不能对文本字段进行求和。您需要将字段显式转换为整数,以便sum
工作
另外,在片段中硬编码列名是不正确的。它只在这种情况下有效,因为您只从一个表中进行选择。如果其中有一些join语句与具有相同列名的其他表,则查询将无法工作。您可以在字符串中使用?
,然后将列作为参数传递
这是最后一件应该起作用的事情:
sum(fragment("(?->>'bytes')::integer", job.info)))
fragment(“sum(info->'bytes'))”
?(info->'bytes')::integer
Trysum(fragment((?->'bytes')::integer,job.info))
。谢谢@Dogbert,上面的内容很完美。fragment(“sum(info->'bytes'))”
(info->'bytes')::integer
Trysum(fragment((?->'bytes')::integer),job.info)))
。多谢@Dogbert,以上内容非常完美。