数据表
CREATE TABLE ` table_main` (
` ID` char ( 36 ) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL ,
` zb_list_str` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci ,
` kf_list_str` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci,
PRIMARY KEY ( ` ID` ) USING BTREE ,
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb3 ;
一行变多行
SELECT
*
FROM
table_main,
JSON_TABLE (
JSON_EXTRACT( CONCAT( '["' , REPLACE ( zb_list_str, ',' , '","' ) , '"]' ) , '$' ) ,
'$[*]' COLUMNS ( id FOR ORDINALITY, ` zb` VARCHAR ( 255 ) PATH '$' ) ) AS t_zb JOIN
JSON_TABLE (
JSON_EXTRACT( CONCAT( '["' , REPLACE ( kf_list_str, ',' , '","' ) , '"]' ) , '$' ) ,
'$[*]' COLUMNS ( id FOR ORDINALITY, ` kf` VARCHAR ( 255 ) PATH '$' ) ) AS t_kf
步骤解释说明
用CONCAT() 和REPLACE () 将待拆分字符串str str_part1,str_part2,str_part3 拼成json数组格式的字符串json_array_str “[“str_part1”,“str_part2”,“str_part3”]” 用JSON_EXTRACT() 将json_array_str 转成 json_array 用JSON_TABLE () (对mysql 版本有要求) 将json_array渲染成一个表格(可以有多行)即可
其他
可以同时如此操作多个字段 每个字段拆分出来的表格(如t_zb)可像普通表格一样进行join等操作(示例中需要两张表的笛卡尔积)