在SQL中不喜欢IN语句

时间:2017-03-19 06:51:52

标签: sql oracle

我需要打印不以元音开头和结尾的名字。我试过这样的话:

SELECT DISTINCT name FROM people WHERE
lower(name) NOT LIKE IN ('a','e','i','o','u')%('a','e','i','o','u');

我收到了错误。

2 个答案:

答案 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分钟。