I have a table like the following, where cities is a JSON column
| ID | cities |
|---|---|
| 1 | ["madrid"] |
| 2 | ["london", "madrid", "paris"] |
| 3 | ["london", "paris"] |
| 4 | ["london"] |
| 5 | ["rome", "berlin"] |
I would like to convert that column to rows, where all individual city gets its own row
| city |
|---|
| madrid |
| london |
| paris |
| rome |
| berlin |
I've tried something like
SELECT distinct JSON_VALUE(JSON_EXTRACT(cities, '$[*]'), '$[*]') as cities FROM table_cities
but I get this instead
| city |
|---|
| madrid |
| NULL |
| london |
CodePudding user response:
- If you are using MySQL version 8.0, you can try using the function
JSON_TABLE(tested on dbfiddle)
SELECT DISTINCT tmp.city
FROM table_cities c,
JSON_TABLE(
c.cities,
'$[*]'
COLUMNS(
city VARCHAR(10) PATH '$[0]'
)
) tmp;
- For MariaDB 10.4.2, you can try this. (tested on dbfiddle)
CREATE TABLE main_table (
cities VARCHAR(1000)
);
-- create procedure
CREATE PROCEDURE proc1()
BEGIN
SET @index := 0;
SELECT @json_length := MAX(JSON_LENGTH(cities))
FROM table_cities;
REPEAT
INSERT INTO main_table (cities)
SELECT JSON_EXTRACT(cities,CONCAT("$[",@index,"]")) FROM table_cities;
SET @index = @index 1;
UNTIL @index = @json_length
END REPEAT;
END;
-- call procedure
CALL proc1;
-- query result
SELECT DISTINCT REPLACE(cities, '"', '') AS city
FROM main_table
WHERE cities IS NOT NULL;
