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

MySQL中统计firstname与lastname列大小写不敏感字符出现次数(仅列出现字符)

MySQL统计姓名列中A-Z字符出现次数的解决方案

核心思路

将firstname和lastname列的内容拼接后,逐个拆分出每个字符,统一转为大写(实现大小写不敏感统计),过滤掉非A-Z的字符,最后分组统计每个字符的出现次数,仅保留有实际出现记录的字符。


MySQL 8.0+ 版本实现(推荐)

利用递归CTE生成字符位置序列,适合处理较长的姓名:

WITH RECURSIVE nums AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 FROM nums WHERE n < 50 -- 按需调整数字上限,覆盖最长姓名的字符数
),
all_chars AS (
    SELECT
        UPPER(SUBSTRING(CONCAT(firstname, ' ', lastname), n, 1)) AS char
    FROM
        your_table -- 替换为你的实际表名
    CROSS JOIN nums
    WHERE
        n <= LENGTH(CONCAT(firstname, ' ', lastname))
)
SELECT
    char AS `Character`,
    COUNT(*) AS `Occurrence Count`
FROM
    all_chars
WHERE
    char BETWEEN 'A' AND 'Z' -- 过滤非字母字符
GROUP BY
    char
ORDER BY
    char;

代码说明:

  • nums递归CTE生成1到指定上限的数字序列,用于定位每个字符的位置;
  • all_chars CTE拼接姓名(添加空格避免姓名连写),按位置提取字符并转为大写;
  • 最终过滤出A-Z字符,分组统计次数并按字母顺序排序。

MySQL 5.x 版本实现(兼容旧版本)

如果不支持递归CTE,可通过UNION ALL手动生成字符位置序列:

SELECT
    UPPER(SUBSTRING(CONCAT(t.firstname, ' ', t.lastname), n, 1)) AS `Character`,
    COUNT(*) AS `Occurrence Count`
FROM
    your_table t
CROSS JOIN (
    SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL
    SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL
    SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10
    -- 按需添加更多数字,确保覆盖最长姓名的字符数
) nums
WHERE
    n <= LENGTH(CONCAT(t.firstname, ' ', t.lastname))
    AND UPPER(SUBSTRING(CONCAT(t.firstname, ' ', t.lastname), n, 1)) BETWEEN 'A' AND 'Z'
GROUP BY
    `Character`
ORDER BY
    `Character`;

示例结果

以数据John Doe和John Smith为例,运行后会得到如下结果:

CharacterOccurrence Count
D1
E1
H3
I1
J2
M1
N2
O2
S1
T1

内容的提问来源于stack exchange,提问作者Tanel Toom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 09:54:14