sql >> データベース >  >> RDS >> Mysql

MySQLJSON配列から個別の値を取得する

    ネクロマンシングで申し訳ありませんが、同様の問題が発生しました。解決策は次のとおりです:JSON_TABLE() MySQL8.0以降で利用可能です。

    まず、行の配列を1行の単一配列にマージします。

    select concat('[',         -- start wrapping single array with opening bracket
        replace(
            replace(
                group_concat(vals),  -- group_concat arrays from rows
                ']', ''),            -- remove their opening brackets
            '[', ''),              -- remove their closing brackets
        ']') as json             -- finish wraping single array with closing bracket
    from (
      select '[801, 751, 603, 753, 803]' as vals
      union select '[801, 751]'
      union select '[578, 66, 15]'
    ) as jsons;
    
    # gives: [801, 751, 603, 753, 803, 801, 751, 578, 66, 15]
    

    次に、json_tableを使用します 配列を行に変換します。

    select val
    from (
        select concat('[',
            replace(
                replace(
                    group_concat(vals),
                    ']', ''),
                '[', ''),
            ']') as json
        from (
          select '[801, 751, 603, 753, 803]' as vals
          union select '[801, 751]'
          union select '[578, 66, 15]'
        ) as jsons
    ) as merged
    join json_table(
        merged.json,
        '$[*]' columns (val int path '$')
    ) as jt
    group by val;
    
    # gives...
    801
    751
    603
    753
    803
    578
    66
    15
    

    https://devを参照してください。 mysql.com/doc/refman/8.0/en/json-table-functions.html#function_json-table

    group by valに注意してください 明確な値を取得するため。 orderすることもできます それらとすべて...

    または、group_concat(distinct val)を使用できます group byなし 1行の結果を取得するためのディレクティブ(!)。

    または、cast(concat('[', group_concat(distinct val), ']') as json) 適切なjson配列を取得するには:[15, 66, 578, 603, 751, 753, 801, 803]

    私のMySQLをJSONストレージとして使用するためのベストプラクティス をお読みください :)




    1. OracleMINUS演算子の説明

    2. MariaDBでのCOS()のしくみ

    3. SQLServerデータベース名の変更

    4. MySqlテーブルデータを配列に選択する