从varchar,Oracle PL / SQL中选择元音

时间:2012-12-06 22:07:20

标签: sql oracle plsql

我正在努力提高varchar中包含的元音的数量, 我一直在谷歌四处寻找,但没有成功。

任何人都可以帮我一把吗?

3 个答案:

答案 0 :(得分:3)

这样的东西
select length(regexp_replace('andrew','[^AEIOUaeiou]')) as vowels from dual;

答案 1 :(得分:2)

如果您使用的是Oracle 11g,则可以使用REXEXP_COUNT函数来确定与模式匹配的内容。

SQL> select regexp_count('andrew', '[aeiou]', 1, 'i') as vowels
  2    from dual;

    VOWELS
----------
         2

第一个参数是您要匹配的字符串'andrew'

第二个参数是匹配模式,在本例中为[aeiou][]表示字符列表;解析器以任何顺序匹配此列表中的任何和所有字符。

第三个参数1是开始位置,表示Oracle应该开始搜索匹配项的字符串的位置索引。它仅包含在内,因此我可以使用第四个参数。

第四个参数是匹配参数,'i'表示我想进行不区分大小写的匹配。这就是字符列表 [aeiouAEIOU]的原因。

如果您使用的是10g,那么REGEXP_COUNT就不存在了。在这种情况下,您可以使用Annjawan's solution更精确的REGEXP_REPLACE版本。

SQL> select length(regexp_replace('andrew','[^aeiou]', '', 1, 0, 'i')) as vowels
  2    from dual;

    VOWELS
----------
         2

克拉(^)表示不是,即用空字符串替换字符串'andrew'中不在字符列表[aeiou]中的每个字符。下一个参数再次是起始位置。第五个参数0表示您要替换匹配模式的每个次出现,并再次使用匹配参数'i'来表示不区分大小写的匹配。

Gaurav's answer不正确。这是因为在角色列表中他包含了逗号。请记住,如果可用的话,字符列表中的所有都会匹配。所以,如果我在你的字符串中引入一个逗号,你的字符串中就会有3个“元音”:

SQL> select regexp_count('an,drew','[a,e,i,o,u,A,E,I,O,U]' ) as vowels
  2    from dual;

    VOWELS
----------
         3

正则表达式不是简单的动物,我强烈建议您在尝试时阅读the documentation

答案 2 :(得分:1)

SELECT length('andrew')
          - length(REGEXP_REPLACE('andrew','[a,e,i,o,u,A,E,I,O,U]','')) 
FROM DUAL; 

输出:2 - ae这里有两个元音。

如果您使用的是Oracle 11g,那么

SELECT REGEXP_COUNT('andrew','[a,e,i,o,u,A,E,I,O,U]' ) from dual