MySQL 5.7では新しいJSON関数が大好きですが、JSONの値を通常のテーブル構造にマージしようとしているブロックで動作しています。MySQLの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(ヴァル、「区切り」)テーブルを返す関数を持っていた場合、私はハック可能性それは(呪われて逃げる)、しかしそれはどちらも利用できません。
私は 'あなたが行うことができないのと同じ理由のために、あなたがそれを行うことができるとは思いませんSPLIT_STRING() ':クエリは、同じ行から結合なしで入力テーブルを複数作成することはできません。 – Barmar
ええ、あなたは正しいかもしれません。私はテーブルの値を持つ関数がサポートされていると仮定していました。明らかに、MySQLはそれを奇妙な人にしています。たとえば、SQL ServerにはSTRING_SPLIT:https://msdn.microsoft.com/en-us/library/mt684588.aspxという名前があります。 Postgressはregexp_split_to_tableの正規表現で分割さえしています。ああ、MySQL ... –
右。 MySQLにはテーブル以外の配列のようなデータ構造はありません。 JSON関数は、スキーマを非正規化するためのブランケット・ライセンスと見なされるべきではありません。 – Barmar