用一段真实带嵌套数组的JSON,对比JSON_TABLE加不加NESTED PATH的区别,看嵌套数组是怎么真实被拍平成关系型多行的。
代码SET @j = '[ {"id":1,"name":"Alice","tags":["admin","dev"]}, {"id":2,"name":"Bob","tags":["user"]} ]'; SELECT * FROM JSON_TABLE(@j, '$[*]' COLUMNS ( id INT PATH '$.id', name VARCHAR(20) PATH '$.name', tags JSON PATH '$.tags' )) AS jt;
id name tags 1 Alice ["admin", "dev"] 2 Bob ["user"]
这一步真实只是把JSON数组的每个对象映射成一行,tags这个内部数组本身没有被展开,原样以JSON文本的形式塞进了一个字段里。
代码SELECT * FROM JSON_TABLE(@j, '$[*]' COLUMNS ( id INT PATH '$.id', name VARCHAR(20) PATH '$.name', NESTED PATH '$.tags[*]' COLUMNS (tag VARCHAR(20) PATH '$') )) AS jt;
id name tag 1 Alice admin 1 Alice dev ← Alice带2个tag,真实拆成了2行 2 Bob user ← Bob只带1个tag,真实还是1行
每一步都是本文上面用真实JSON_TABLE查询跑出来的原始结果。
JSON_TABLE(json_doc, path COLUMNS (...)):MySQL 8.0.4起支持