【发布时间】:2017-02-15 19:33:46
【问题描述】:
更新:现在可以通过 JSON_TABLE 函数在 MySQL 8 中实现:https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html
我喜欢 MySQL 5.7 中的新 JSON 函数,但在尝试将 JSON 中的值合并到普通表结构时遇到了障碍。
抓取 JSON、操作并从中提取数组等非常简单。 JSON_EXTRACT 一路。但是反过来呢,从 JSON 数组到行呢?也许我对现有的 MySQL JSON 功能很感兴趣,但我一直无法弄清楚这一点。
例如,假设我有一个 JSON 数组,并且想为数组中的每个元素插入一行及其值?我发现的唯一方法是编写一堆 JSON_EXTRACT(... '$[0]') JSON_EXTRACT(... '$[1]') 等并将它们合并在一起。
或者,假设我有一个 JSON 数组并想将 GROUP_CONCAT() 转换为单个逗号分隔的字符串?
换句话说,我知道我可以做到:
SET @j = '[1, 2, 3]';
SELECT GROUP_CONCAT(JSON_EXTRACT(@j, CONCAT('$[', x.n, ']'))) AS val
FROM
(
SELECT 0 AS n
UNION
SELECT 1 AS n
UNION
SELECT 2 AS n
UNION
SELECT 3 AS n
UNION
SELECT 4 AS n
UNION
SELECT 5 AS n
) x
WHERE x.n < JSON_LENGTH(@j);
但这伤害了我的眼睛。还有我的心。
我该怎么做:
SET @j = '[1, 2, 3]';
SELECT GROUP_CONCAT(JSON_EXTRACT(@j, '$[ * ]'))
...并将数组中的值与 JSON 数组本身连接在一起?
我想我在这里寻找的是某种 JSON_SPLIT,类似于:
SET @j = '[1, 2, 3]';
SELECT GROUP_CONCAT(val)
FROM
JSON_SPLIT(JSON_EXTRACT(@j, '$[ * ]'), '$')
如果 MySQL 有正确的 STRING_SPLIT(val, 'separator') 表返回函数,我可以破解它(该死的转义),但这也不可用。
【问题讨论】:
-
我不认为你可以这样做,出于同样的原因你不能这样做
SPLIT_STRING():查询不能从没有连接的输入表的同一行创建多行。 -
是的,你可能是对的。我曾假设支持表值函数,因为几乎所有其他 DBMS 都拥有它们。显然 MySQL 是个奇怪的人。例如,SQL Server 有一个非常好的 STRING_SPLIT:msdn.microsoft.com/en-us/library/mt684588.aspx。 Postgress 甚至在 regexp_split_to_table 中有一个正则表达式拆分。啊,MySQL...
-
对。 MySQL 除了表之外没有类似数组的数据结构。 JSON 函数不应被视为非规范化架构的一揽子许可。
-
好吧,如果有像其他 DBMS 那样的表值函数,那么它会返回一个表,而不是其他类似数组的结构......你可以从函数中选择。
标签: mysql json database-normalization