9

文字列の最後の文字を取得して、それが母音か子音かを確認するにはどうすればよいですか? 私はオラクル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 で実行すると、「最初の文字の説明」が空になります。コードの何が問題になっていますか?

4

2 に答える 2

14

これを試してみてください。完全ではありませんが、簡単な調整で思いどおりに動作させることができます。

 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;
于 2012-11-04T22:23:00.477 に答える
5

あなたのデータを見てください。可能性としては、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 
于 2014-05-15T14:19:23.263 に答える