2012-11-04 108 views
5

嗨,大家只是想问我如何得到字符串的最后一个字母,并检查它是元音还是辅音。顺便说一句,使用Oracle 10g。感谢那些会帮助我的人。和平!如何获得字符串的最后一个字母

这里就是我想出了已经:

SELECT last_name, 
     Substr(last_name, -1, 1) "Last letter", 
     Substr(last_name, 1, 1) "First letter", 
     CASE 
     WHEN Substr(last_name, -1, 1) IN ('a', 'e', 'i', 'o', 'u') THEN 
     'ends with a vowel' 
     WHEN Substr(last_name, -1, 1) IN ('b', 'c', 'd', 'f', 
              'g', 'h', 'j', 'k', 
              'l', 'm', 'n', 'p', 
              'q', 'r', 's', 't', 
              'v', 'w', 'x', 'y', 'z') THEN 
     'ends with a consonant' 
     END      "Last Letter Description", 
     CASE 
     WHEN Substr(last_name, 1, 1) IN ('a', 'e', 'i', 'o', 'u') THEN 
     'starts with a consonant' 
     WHEN Substr(last_name, 1, 1) IN ('b', 'c', 'd', 'f', 
              'g', 'h', 'j', 'k', 
              'l', 'm', 'n', 'p', 
              'q', 'r', 's', 't', 
              'v', 'w', 'x', 'y', 'z') THEN 
     'starts with a consonant' 
     END      "First Letter Description" 
FROM employees 
GROUP BY first_name, 
      last_name 

现在,当你执行这个在Oracle 10g中的“第一个字母描述”是空的!请帮助我,请问您认为我的代码有什么问题?

+0

检查oracle函数substr和regexp –

+0

在SQL中? PL/SQL?你期望一个布尔结果吗?如果最后一个字母是'Y'呢? – Wolf

+0

我想在oracle中执行 –

回答

9

试试这个,不完整的,但易于调整,你可以把它工作,你想要的方式:

FUNCTION last_is_vowel (string_in VARCHAR2) 
    RETURN BOOLEAN 
IS 
BEGIN 
    RETURN CASE WHEN LOWER(SUBSTR(string_in, -1)) IN ('a', 'e', 'i', 'o', 'u') 
       THEN TRUE 
       ELSE FALSE 
      END; 
END last_is_vowel; 
+0

你可以使这个更简单吗?我需要从employees表中检索数据,所以这对我来说有点复杂。 –

+2

@DwayneRadar我不知道你可以得到多少比一个单一的CASE声明更简单... –

+0

我同意lc。我不能说比这更简单。 该函数测试字符串的最后一个字符并检查它是'a','e','i','o'还是'u'。 如果你想在SQL中使用它,你必须在这个函数上构建一个包装器。 –

3

看看你的数据。机会是employees.last_name中的第一个字符是大写。请记住,Oracle是区分大小写的。你可以使用UPPER()或LOWER()来帮助找到你的匹配。

此外,如João建议的那样,仅搜索元音并使用else语句来查找排除项会更有效。

SELECT last_name, 
     Substr(last_name, -1, 1) "Last character", 
     Substr(last_name, 1, 1) "First character", 
     CASE 
     WHEN lower(Substr(last_name, -1, 1)) IN ('a', 'e', 'i', 'o', 'u') THEN 
     'ends with a vowel' 
     ELSE 
     'does not end with a vowel' 
     END      "Last Letter Description", 
     CASE 
     WHEN lower(Substr(last_name, 1, 1)) IN ('a', 'e', 'i', 'o', 'u') THEN 
     'starts with a vowel' 
     ELSE 
     'does not start with a vowel' 
     END      "First Letter Description" 
FROM employees 
GROUP BY first_name, 
      last_name 
相关问题