You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中实现字符串对应映射字符数值求和的方法

嘿,这个需求我之前也碰到过,刚好有两种实用的解决方案,你可以根据自己的MySQL版本和使用场景来选:

方案一:纯SQL语句(适合MySQL 8.0+,支持CTE)

首先假设你的表结构是这样的(我先建个示例表方便演示):

CREATE TABLE char_values (
    char_col CHAR(1) PRIMARY KEY,
    num_col INT NOT NULL
);

-- 插入你提到的示例数据
INSERT INTO char_values (char_col, num_col) VALUES
('A', 1), ('B', 2), ('C', 3), ('D', 4), ('E', 5);

接下来用递归CTE把指定字符串拆分成单个字符,再和值表关联求和。比如计算BAD的总和:

WITH RECURSIVE split_chars AS (
    SELECT 
        1 AS pos,
        SUBSTRING('BAD', 1, 1) AS single_char,
        LENGTH('BAD') AS total_length
    UNION ALL
    SELECT 
        pos + 1,
        SUBSTRING('BAD', pos + 1, 1),
        total_length
    FROM split_chars
    WHERE pos < total_length
)
SELECT SUM(cv.num_col) AS total_sum
FROM split_chars sc
JOIN char_values cv ON sc.single_char = cv.char_col;

小说明:

  • 递归CTE会把字符串逐位拆成多行,每一行对应一个字符
  • 如果字符串里有不在你的值表中的字符,这个查询会自动忽略它(如果想把这类字符算0,可以改成LEFT JOIN,然后用COALESCE(cv.num_col, 0)求和)

方案二:存储过程(适合重复调用,兼容所有MySQL版本)

如果需要频繁计算不同字符串的总和,写个存储过程会更方便:

DELIMITER //

CREATE PROCEDURE CalculateCharTotal(IN input_string VARCHAR(255), OUT result_sum INT)
BEGIN
    DECLARE str_length INT;
    DECLARE current_position INT DEFAULT 1;
    DECLARE current_char CHAR(1);
    DECLARE current_num INT;
    SET result_sum = 0;
    SET str_length = LENGTH(input_string);
    
    -- 循环遍历字符串的每个字符
    WHILE current_position <= str_length DO
        SET current_char = SUBSTRING(input_string, current_position, 1);
        -- 查找当前字符对应的数值
        SELECT num_col INTO current_num FROM char_values WHERE char_col = current_char;
        -- 如果找到数值就累加,没找到则跳过(也可以改成加0)
        IF current_num IS NOT NULL THEN
            SET result_sum = result_sum + current_num;
        END IF;
        SET current_position = current_position + 1;
    END WHILE;
END //

DELIMITER ;

调用方式很简单:

SET @total = 0;
CALL CalculateCharTotal('BAD', @total);
SELECT @total AS total_sum; -- 输出7

兼容MySQL 5.x的纯SQL方案

如果你的MySQL版本不支持CTE(比如5.7及以下),可以用数字辅助表来拆分字符串:

SELECT SUM(cv.num_col) AS total_sum
FROM (
    SELECT SUBSTRING('BAD', nums.n, 1) AS single_char
    FROM (
        -- 这里的数字要覆盖你可能用到的最大字符串长度
        SELECT 1 AS n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5
        UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
    ) nums
    WHERE nums.n <= LENGTH('BAD')
) sc
JOIN char_values cv ON sc.single_char = cv.char_col;

内容的提问来源于stack exchange,提问作者Raghavendra Ganiga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:15:25