Search code examples
mysqlarraysjsonjson-extract

Extract JSON object's values as array from MySQL JSON column


I have a MySQL column of json type. In there, a dict like JSON object is stored. Now, I want to extract the values from this JSON object and create a JSON array.

How can I achieve this?

Example Query

with json_objs(json_col) as (
  select CAST('{"key1": "value1", "key2": "value2"}' AS JSON)
  UNION ALL
  select CAST('{"key3": "value3", "key4": "value4"}' AS JSON)
)
select SOME_EXPR_I_CAN_T_FIGURE_OUT from json_objs

Expected result

+----------------------+
| resulting_column     |
+----------------------+
| ["value1", "value2"] |
| ["value3", "value4"] |
+----------------------+

(If table DDL is desired:)

CREATE TABLE `json_objs` (
  `json_col` json DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Solution

  • You can use the -> operator as in the expression column -> path as follows:

    create table table1 (
       json_dict JSON
    );
    
    insert into table1 values('{"ak":"av","bk":"bv"}');
    insert into table1 values('{"ak2":"av2","bk2":"bv2"}');
    
    select * from table1;
    +------------------------------+
    | json_dict                    |
    +------------------------------+
    | {"ak": "av", "bk": "bv"}     |
    | {"ak2": "av2", "bk2": "bv2"} |
    +------------------------------+
    2 rows in set (0.00 sec)
    
    select json_dict->"$.*" from table1;
    +------------------+
    | json_dict->"$.*" |
    +------------------+
    | ["av", "bv"]     |
    | ["av2", "bv2"]   |
    +------------------+
    2 rows in set (0.00 sec)
    

    https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html#operator_json-column-path