Oracle SQL姓名标准化与去重:去除大写、末尾s合并重复项
解决方案
要实现转小写、移除末尾字母s、去重并正确统计的需求,调整后的Oracle SQL语句如下:
SELECT REGEXP_REPLACE(LOWER(REGEXP_SUBSTR(NAME, '(\S+)$')), 's$', '') AS NAMEZ, COUNT(CASE WHEN daysout IS NULL THEN 1 END) AS home, COUNT(CASE WHEN daysout IS NOT NULL THEN 1 END) AS away, COUNT(*) AS daystotal FROM peoplein GROUP BY REGEXP_REPLACE(LOWER(REGEXP_SUBSTR(NAME, '(\S+)$')), 's$', '')
关键调整细节:
- 转小写处理:用
LOWER()替换原语句的UPPER(),直接得到小写格式的姓名 - 移除末尾
s:通过REGEXP_REPLACE(字段, 's$', '')精准匹配姓名末尾的单个s并移除;如果姓名末尾没有s,则保持原内容不变 - 正确分组去重+统计:用
GROUP BY替代DISTINCT——因为你需要基于处理后的姓名分组计算各类计数,DISTINCT仅能对整行去重,无法配合聚合函数实现正确的分组统计逻辑
处理流程验证:
原始数据:
Johns JOHNS John Jack JACK
- 提取最后部分并转小写:
johns、johns、john、jack、jack - 移除末尾
s:所有johns转为john,jack保持不变 - 分组统计后得到唯一的
john和jack,同时输出对应分组的home/away/daystotal计数
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

