项目中需要对出现计费异常的运营订单做还原处理,即将其原始数据更新到订单表。其中计费规则使用了 JSON 字符串格式进行存储,但在筛选计费异常的运营订单过程中,需要解析还原内部字段做计算。

百度提供了两个版本,通用版:

SELECT JSON_EXTRACT(profile, '$.name') AS user_name
FROM users;

MySQL 5.7+,你也可以使用更简洁的操作符 ->

SELECT profile->'$.name' AS user_name
FROM users;

JSON 多层级数据可以通过 . 一层一层的访问。比如 corder.price_desc->'$.charge_type.time_factor'

先备份现有的订单运营记录(之后要删除掉,因为记录影响统计数据,且未做软删),之后把订单运营记录中的数据更新到订单表。

百度得到一个 sql 示例:

UPDATE table1
INNER JOIN table2 ON table1.employee_id = table2.employee_id
SET table1.salary = table2.new_salary
WHERE table2.status = 'approved';

另一篇博客还介绍另外两种写法:

UPDATE table1
SET table1.salary = (
SELECT tables2.new_salary FROM table2
WHERE table2.employee_id = table1.employee_id
AND table2.status = 'approved';
);
UPDATE table1, table2
SET table1.salary = tables2.new_salary
WHERE table2.employee_id = table1.employee_id
AND table2.status = 'approved';
);

上面的是子查询,下面的与 inner join 一致,应该属于不同的写法。