MySQL中如何动态将ENUM列值传入JSON_TABLE输出为多行结果
可行性结论
该动态需求完全可实现。你之前的两种写法报错,核心原因是MySQL对JSON_TABLE表函数的入参有语法限制:
- 同一FROM层级下,JSON_TABLE无法直接引用平级声明的CTE/表的列
- JSON_TABLE的第一个入参不支持直接传入标量子查询
正确实现写法
只需要调整CTE和JSON_TABLE的关联方式,用交叉连接让CTE的列在JSON_TABLE的参数上下文里可被识别即可,代码如下:
WITH t AS ( SELECT REPLACE(CONCAT("[", SUBSTRING(COLUMN_TYPE, 6, LENGTH(COLUMN_TYPE) - 6), "]"), "'", '"') AS types FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='myschema' AND TABLE_NAME='tbl_items' AND COLUMN_NAME='itemTypes' LIMIT 1 ) SELECT tt.type FROM t CROSS JOIN JSON_TABLE(t.types, "$[*]" COLUMNS( type CHAR(1) PATH "$" )) AS tt;
执行后即可得到你预期的每个枚举值单独成行的结果。
注意事项
- 该写法要求MySQL版本为8.0.19及以上,更低的8.0版本不支持在JSON_TABLE中引用关联表的列。
- 如果你的枚举值长度超过1个字符,请调整
type CHAR(1)中的字符长度定义,避免枚举值被截断。 - 你当前用字符串替换把ENUM定义转成JSON数组的逻辑,仅适用于枚举值不含转义单引号的常规场景,如果枚举值本身包含单引号,需要额外补充转义处理逻辑,避免生成非法JSON格式导致JSON_TABLE执行失败。
内容的提问来源于stack exchange,提问作者Yanick Rochon
相关产品推荐
相关产品推荐

