有没有等效的方法可以在MariaDB中执行MySQL的JSONOBJECTAGG()?

ell*_*len 5 mysql database json mariadb

我正在为数据项目使用的服务器崩溃了,现在我正在重新创建数据库。我曾经在MySQL数据库上工作,现在我正在使用MariaDB。我以前从未使用过MariaDB。

以前,我使用以下命令将一些数据从另一个表插入到一个表中:

CREATE TABLE collaborators_list 
SELECT awards.id, awards.researcher_name, awards.organization_id, 
    JSON_OBJECTAGG(awards.fiscal_year, coapplicants.coapplicant_name, 
    coapplicants.organization_number) 
AS 'coapplicants_list' FROM awards 
INNER JOIN coapplicants 
ON awards.id=coapplicants.id 
GROUP BY awards.researcher_name, awards.organization_id;
Run Code Online (Sandbox Code Playgroud)

基本上,我想在MariaDB中做同样的事情。我试着在这里看:https : //mariadb.com/kb/en/library/json-functions/ 但除非我误读了一些东西,否则这些都不是我真正想要的...

救命!

Mad*_*iya 7

没有,MariaDB的仍然不支持JSON_ARRAYAGG和JSON_OBJECTAGG功能。已提出要求此功能的JIRA票证:https : //jira.mariadb.org/browse/MDEV-16620

现在,从的文档中JSON_OBJECTAGG():

它仅使用两个列名或表达式作为参数,其中第一个用作键,第二个用作值。

如果任何键名称为NULL或参数个数不等于2,则会发生错误。

但是,您要在中指定三个参数JSON_OBJECTAGG(awards.fiscal_year, coapplicants.coapplicant_name, coapplicants.organization_number)。因此您尝试的查询将无法正常运行。

现在,在没有所需的功能,我们可以利用Group_Concat()用Concat()。我假设您只需要前两个参数(如上一节所述)。

GROUP_CONCAT( DISTINCT CONCAT('"', awards.fiscal_year, '": "',
                              coapplicants.coapplicant_name, '"') 
              SEPARATOR ', ')
Run Code Online (Sandbox Code Playgroud)

请注意,如果字符串变得非常长,Group_Concat()可能会截断它。因此,可以在执行上述查询之前通过执行以下查询来增加允许的长度:

SET SESSION group_concat_max_len = @@max_allowed_packet;
Run Code Online (Sandbox Code Playgroud)

  • @ellen:这里是一个版本,请参见[dbfiddle](https://dbfiddle.uk/?rdbms=mariadb_10.3&fiddle=6c202c2f467e6a7f2b879d9db464a095)。 (2认同)
  • 我曾经和@RickJames一起参加过[评论陪练](/sf/answers/4060661531/),为什么“ SET SESSION group_concat_max_len = @@ max_allowed_pa​​cket;”可能不好用..它仍然存在有点疑问,在上述较现代的MySQL或MariaDB中,上述提到的sort_buffer_size设置与GROUP_CONCAT()中可能的隐式ORDER BY结合使用时,在内存和性能方面会发生什么? )版本,但我仍然没有对其进行研究。 (2认同)