从json列获取所有键并转换为行

lf5gs5x2  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(136)

我有一个如下所示的表,其中cities是JSON
| 识别码|城市|
| - -|- -|
| 一个|[“马德里]|
| 2个|[伦敦马德里巴黎]|
| 三个|[“伦敦”,“巴黎”]|
| 四个|[“伦敦”]|
| 五个|[“罗马”,“柏林”]|
我想将列转换为行,这样所有城市都有自己行
| 城市|
| - -|
| 马德里|
| 伦敦|
| 巴黎|
| 罗马|
| 柏林|
我试过

SELECT distinct JSON_VALUE(JSON_EXTRACT(cities, '$[*]'), '$[*]') as cities FROM table_cities

但我得到了这个
| 城市|
| - -|
| 马德里|
| 空值|
| 伦敦|

mzaanser

mzaanser1#

1.如果您使用的是MySQL 8.0版,您可以尝试使用JSON_TABLE函数(在dbfiddle上测试)

SELECT DISTINCT tmp.city
FROM table_cities c,
JSON_TABLE(
  c.cities,
  '$[*]'
  COLUMNS(
  city VARCHAR(10) PATH '$[0]'
  )
) tmp;

1.对于MariaDB 10.4.2,您可以尝试此操作。(在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;

相关问题