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_charsCTE拼接姓名(添加空格避免姓名连写),按位置提取字符并转为大写;- 最终过滤出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为例,运行后会得到如下结果:
| Character | Occurrence Count |
|---|---|
| D | 1 |
| E | 1 |
| H | 3 |
| I | 1 |
| J | 2 |
| M | 1 |
| N | 2 |
| O | 2 |
| S | 1 |
| T | 1 |
内容的提问来源于stack exchange,提问作者Tanel Toom
相关产品推荐
相关产品推荐

