MySQL中使用SET命令对JSON字段内值排序的可行性咨询
问题解答
单纯只用SET命令没办法直接完成JSON数组的排序需求,得结合MySQL的JSON函数来实现。下面是具体的实现方式:
一、将排序结果赋值给变量
如果你是要把排序后的数组存到变量里,可以用SET配合JSON_TABLE和JSON_ARRAYAGG函数:
1. 字符串排序(处理eligible_vehicle_type)
SET @vehicles = ( SELECT JSON_ARRAYAGG(value ORDER BY value ASC) FROM inventory, JSON_TABLE(eligible_vehicle_type, '$[*]' COLUMNS(value VARCHAR(10) PATH '$')) AS jt WHERE id = 1 );
这段代码先通过JSON_TABLE把JSON数组拆成单行数据,按字符串顺序排序后,再用JSON_ARRAYAGG重新拼成有序数组,最后用SET赋值给@vehicles变量。
2. 按整数值排序(处理weight_class)
因为weight_class里的数值是以字符串形式存储的,需要先转成整数再排序:
SET @weight_class = ( SELECT JSON_ARRAYAGG(value ORDER BY CAST(value AS UNSIGNED) ASC) FROM inventory, JSON_TABLE(weight_class, '$[*]' COLUMNS(value VARCHAR(10) PATH '$')) AS jt WHERE id = 1 );
二、直接更新表中数据
如果要把排序后的结果直接写回inventory表,可以用UPDATE语句结合上述函数,本质也是用SET子句来更新列值:
UPDATE inventory SET eligible_vehicle_type = ( SELECT JSON_ARRAYAGG(value ORDER BY value ASC) FROM JSON_TABLE(eligible_vehicle_type, '$[*]' COLUMNS(value VARCHAR(10) PATH '$')) AS jt ), weight_class = ( SELECT JSON_ARRAYAGG(value ORDER BY CAST(value AS UNSIGNED) ASC) FROM JSON_TABLE(weight_class, '$[*]' COLUMNS(value VARCHAR(10) PATH '$')) AS jt ) WHERE id = 1;
简单来说,SET本身只是负责赋值操作,对JSON数组的排序逻辑得靠MySQL的JSON处理函数来完成,两者结合才能实现你的需求。
内容的提问来源于stack exchange,提问作者brooklynveezy
相关产品推荐
相关产品推荐

