【发布时间】:2017-08-10 13:28:01
【问题描述】:
我需要打印不以元音开头和结尾的名称。我试过这样:
SELECT DISTINCT name FROM people WHERE
lower(name) NOT LIKE IN ('a','e','i','o','u')%('a','e','i','o','u');
我出错了。
【问题讨论】:
我需要打印不以元音开头和结尾的名称。我试过这样:
SELECT DISTINCT name FROM people WHERE
lower(name) NOT LIKE IN ('a','e','i','o','u')%('a','e','i','o','u');
我出错了。
【问题讨论】:
在大型数据集的情况下,出于性能原因,您可能希望尽量避免使用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 分钟以上)。
【讨论】:
您可以使用regexp_like 和匹配参数i 进行不区分大小写的匹配:
select distinct name from people
where not regexp_like(name, '^[aeiou]($|.*[aeiou]$)', 'i');
图案细节:
^[aeiou] - 以元音开头($|.*[aeiou]$) - 要么只有一个字符(在第一步匹配)要么以元音结尾。【讨论】: