Supondo que todos os nomes das cidades sejam letras minúsculas, você pode fazer algo assim:
select city
from station
where substr(city, 1, 1) in ('a', 'e', 'i', 'o', 'u')
and substr(city, -1, 1) in ('a', 'e', 'i', 'o', 'u')
substr(city, 1, 1)
pega a substring de city
começando na posição 1 e de comprimento 1 (ou seja, apenas a primeira letra). substr(city, -1, 1)
é muito semelhante, apenas a posição é diferente:-1
significa a primeira letra do final da string - então isso lhe dará a última letra do nome da cidade. Se
city
pode ter letras maiúsculas e minúsculas, no WHERE
cláusula use lower(city)
em vez de city
. EDITAR :Por solicitação popular, aqui está como o mesmo pode ser feito com expressões regulares. Não faz sentido usar uma abordagem de expressão regular aqui; as funções de string padrão (como SUBSTR) são quase certas de serem muito mais rápidas do que qualquer coisa baseada em expressões regulares.
....
where regexp_like(city, '^(a|e|i|o|u).*(a|e|i|o|u)$', 'i')
(a|e|i|o|u)
significa exatamente um desses caracteres. ^
significa âncora no início da string, e similarmente $
no final da corda. Estritamente falando, isso requer que o nome da cidade tenha pelo menos duas letras; se nomes de cidade de uma letra forem possíveis, isso pode ser modificado facilmente. (A abordagem SUBSTR não exigiria mudanças.) O último argumento,
'i'
, torna a correspondência regexp insensível a maiúsculas e minúsculas (apenas no caso de ser necessário).