-- 回填 mch_manage.discounts_rate: -- 从 discounts_price 文案(如"享9.5折"、"享菜品7.8折(不含酒水)"、"全场95折")中提取"折"前面的数字, -- 折算规则与 discounts_rate 语义(1-99,10=1折)一致: -- 小数或个位整数("9.5折"->95、"9折"->90、"0.5折"->5) 乘以10; -- 两位整数("95折")本身即百分比,保持原值 -> 95。 -- 仅填充 discounts_rate 为空的行,已配置的值不覆盖;提取不到"数字+折"或折算结果不在 1-99 的行跳过。 -- ① 预览:执行前先跑这条,人工确认折算结果 SELECT id, name, discounts_price, ROUND(CAST(REPLACE(REGEXP_SUBSTR(discounts_price, '[0-9]+(\\.[0-9]+)?折'), '折', '') AS DECIMAL(10, 2)) * IF(CAST(REPLACE(REGEXP_SUBSTR(discounts_price, '[0-9]+(\\.[0-9]+)?折'), '折', '') AS DECIMAL(10, 2)) < 10, 10, 1)) AS will_rate FROM mch_manage WHERE discounts_rate IS NULL AND discounts_price REGEXP '[0-9]+(\\.[0-9]+)?折'; -- ② 执行回填 UPDATE mch_manage m JOIN (SELECT id, ROUND(CAST(REPLACE(REGEXP_SUBSTR(discounts_price, '[0-9]+(\\.[0-9]+)?折'), '折', '') AS DECIMAL(10, 2)) * IF(CAST(REPLACE(REGEXP_SUBSTR(discounts_price, '[0-9]+(\\.[0-9]+)?折'), '折', '') AS DECIMAL(10, 2)) < 10, 10, 1)) AS rate FROM mch_manage WHERE discounts_rate IS NULL AND discounts_price REGEXP '[0-9]+(\\.[0-9]+)?折') t ON t.id = m.id SET m.discounts_rate = t.rate WHERE t.rate BETWEEN 1 AND 99; -- ③ 核对:回填结果与原文对照 SELECT id, name, discounts_price, discounts_rate FROM mch_manage WHERE discounts_rate IS NOT NULL ORDER BY update_time DESC;