如何筛选列值包含全部元音字母的SQL数据行?有无更优实现方案?
筛选包含全部元音字母的数据行的优化方案
你的原LIKE写法兼容性极强,几乎所有SQL数据库都能运行,但确实有更简洁的实现方式,不同数据库的优化写法如下:
1. MySQL/MariaDB(8.0及以上版本)
利用支持Perl兼容正则表达式的REGEXP操作符,通过正向预查确保字符串同时包含所有元音字母:
SELECT str FROM letters WHERE str REGEXP '^(?=.*a)(?=.*e)(?=.*i)(?=.*o)(?=.*u).*$';
2. PostgreSQL
用~操作符匹配正则,语法逻辑和MySQL一致:
SELECT str FROM letters WHERE str ~ '^(?=.*a)(?=.*e)(?=.*i)(?=.*o)(?=.*u).*$';
3. SQL Server
若使用2016及以上版本,可使用PATINDEX替代LIKE(逻辑和原写法一致,部分场景性能略优);若要更简洁的正则写法需开启CLR集成,常用写法如下:
SELECT str FROM letters WHERE PATINDEX('%a%', str) > 0 AND PATINDEX('%e%', str) > 0 AND PATINDEX('%i%', str) > 0 AND PATINDEX('%o%', str) > 0 AND PATINDEX('%u%', str) > 0;
方案对比
- 原LIKE写法:兼容性拉满,所有数据库通用,但代码行数偏多;
- 正则写法:代码更简洁,但依赖数据库的正则支持,不同数据库语法有细微差异。
最终筛选结果为:education
内容的提问来源于stack exchange,提问作者Learn Hadoop
相关产品推荐
相关产品推荐

