使用SELECT DISTINCT筛选不合规姓名的SQL语句正确性咨询
原写法问题说明
原SQL写法完全不正确,存在两个核心问题:
- 逻辑覆盖不全:仅校验了字段是否包含1~6的数字,漏掉了0、7、8、9四个数字,你示例中ID为4的
hi789记录包含7、8、9,用原SQL完全查询不到,无法得到预期结果 - 写法冗余低效:多个OR条件拼接的LIKE查询不仅维护成本高,执行性能也远低于批量匹配方案
优化实现方案
从你的示例可以推出姓名的规范是「仅允许英文字母和空格,不能包含数字」,要筛选不符合规范的记录,核心逻辑是匹配字段中是否存在数字,根据你使用的数据库类型,可选择对应更简洁的实现:
- SQL Server 环境:
select * from table where full_name like '%[0-9]%'
- MySQL / MariaDB 环境:
select * from table where full_name regexp '[0-9]'
- PostgreSQL 环境:
select * from table where full_name ~ '[0-9]'
如果需要更严格的校验(比如同时过滤特殊符号、非英文文字等不符合姓名规范的内容),可以用反向匹配规则,比如MySQL环境下可以写:
select * from table where full_name regexp '[^a-zA-Z ]'
只要字段中出现英文字母、空格之外的字符,都会被判定为不符合规范筛选出来,覆盖场景更全面。
内容的提问来源于stack exchange,提问作者KATE SR
相关产品推荐
相关产品推荐

