MySQLのJSON配列を行に変換する 質問する

MySQLのJSON配列を行に変換する 質問する

アップデート:これは、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;

おすすめ記事