我需要打印不以元音开头和结尾的名字。我试过这样的话:
SELECT DISTINCT name FROM people WHERE
lower(name) NOT LIKE IN ('a','e','i','o','u')%('a','e','i','o','u');
我收到了错误。
答案 0 :(得分:1)
您可以将regexp_like
与匹配参数i
一起用于不区分大小写的匹配:
select distinct name from people
where not regexp_like(name, '^[aeiou]($|.*[aeiou]$)', 'i');
模式细节:
^[aeiou]
- 以元音开头($|.*[aeiou]$)
- 要么只有一个字符(在第一步中匹配),要么以元音结尾。答案 1 :(得分:1)
在大型数据集的情况下,您可能希望避免因性能原因使用REGEXP
。
在这种情况下,TRANSLATE
是你的朋友。
1)将所有元音翻译成一个代表
2)用选定的元音
执行正常的LIKE谓词select txt from tab1
where translate(lower(txt),'aeiou','aaaaa') not like 'a%a';
REGEXP 是强大的,但如果可以避免,则不应在非平凡数据集上使用。 (我的8M行测试数据使用TRANSLATE
为7秒,而使用REGEXP
则为2分钟。