アップデート:これは、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') テーブルを返す関数があれば、それをハックすることもできます (エスケープは気にしない) が、それも利用できません。
ベストアンサー1
やり方はこうだJSON_テーブルMySQL 8以降の場合:
SELECT *
FROM
JSON_TABLE(
'[5, 6, 7]',
"$[*]"
COLUMNS(
Value INT PATH "$"
)
) data;
また、区切られた文字列を取得して JSON 文字列に変換することで、MySQL にはない一般的な文字列分割関数 (PG の regexp_split_to_table や MSSQL の STRING_SPLIT に類似) として使用することもできます。
set @delimited = 'a,b,c';
SELECT *
FROM
JSON_TABLE(
CONCAT('["', REPLACE(@delimited, ',', '", "'), '"]'),
"$[*]"
COLUMNS(
Value varchar(50) PATH "$"
)
) data;