连接所有JSON对象字符串值



在MySQL 8 JSON列中,我有一个具有不同类型值的JSON对象(但没有嵌套对象)。这样的:

{
"abc": "Something123",
"foo": 63.4,
"bar": "Hi world!",
"xyz": false
}

选择连接字符串值的最简单方法是什么?作为一个例子,从上面的JSON中我们应该得到"Something123 Hi world!"?

MySQL 8.0的解决方案:

select group_concat(json_unquote(json_extract(t.data, concat('$.', j.`key`))) separator '') as joined_string 
from mytable cross join json_table(json_keys(mytable.data), '$[*]' columns (`key` varchar(20) path '$')) j 
join mytable t on json_type(json_extract(t.data, concat('$.', j.`key`)))='STRING';

给出示例数据的输出:

+-----------------------+
| joined_string         |
+-----------------------+
| Something123Hi world! |
+-----------------------+

我想知道,如果你需要这样做,在JSON中存储数据是否是一个好主意。这个解决方案开发起来很复杂,而且很难调试或修改。

当您真正希望SQL谓词将文档的字段视为离散元素时,使用JSON将数据存储为文档,这比使用普通的行和列更难。

如果你使用的是MySQL 5.7或更早版本,那么JSON_TABLE()函数是不支持的。在这种情况下,我建议将整个JSON文档获取到应用程序中,并将其分解为一个可以操作的对象。

解决方案:

SELECT GROUP_CONCAT(va SEPARATOR ' ') str_vals_only
FROM
(
SELECT id, JSON_UNQUOTE(JSON_EXTRACT(my_json_col, CONCAT('$.', j.obj_key))) va
FROM my_tbl,
JSON_TABLE(JSON_KEYS(my_json_col), '$[*]' COLUMNS(obj_key TEXT PATH "$")) j
WHERE JSON_TYPE(JSON_EXTRACT(my_json_col, CONCAT('$.', j.obj_key))) = 'STRING'
) a
GROUP BY id

不是很简单和简洁,但我想这是最好的了。

我喜欢MySQL对JSON的支持。对于某些特定的情况,JSON类型可以提供一个非常好的和灵活的解决方案。这就是我不考虑切换到MariaDB(它对JSON的支持要有限得多)的主要原因。但是我希望有更多的JSON操作函数。JSON_TABLE函数非常强大,但是它可能有点复杂和冗长。

最新更新