Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 使用EXTO查询对jsonb列中的字段求和_Postgresql_Elixir_Ecto - Fatal编程技术网

Postgresql 使用EXTO查询对jsonb列中的字段求和

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

假设我在Postgres DB中有一个名为infojsonb类型列。其中一个字段是bytes,它作为整数存储在info字段中

如果我尝试将EXTO查询中info=>bytes字段的值相加,如下所示:

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
Try
sum(fragment((?->'bytes')::integer,job.info))
。谢谢@Dogbert,上面的内容很完美。
fragment(“sum(info->'bytes'))”
(info->'bytes')::integer
Try
sum(fragment((?->'bytes')::integer),job.info)))
。多谢@Dogbert,以上内容非常完美。