Ваша попытка не работает, потому что в Oracle условия LIKE / NOT LIKE выполняют , а не , работают с регулярными выражениями. Вместо этого есть только два (или три) метасимвола: %
(который вы пытались использовать правильно), подчеркивание, которое заменяет ровно один символ, и, возможно, экранирующий символ (если вам нужно экранировать % или _), которое должно быть объявлено в условии LIKE / NOT LIKE. Все остальное - буквальные символы. Название города не начинается с подстроки [AEIOUaeiou] (12 символов). Это - это то, что мешало вашему состоянию; так что, действительно, это не помешало каким-либо именам быть включенными в вывод.
GMB дал вам 100% правильное решение, в духе вашего вопроса - использование регулярных выражений.
Я знаю только Oracle, нет другого продукта БД; но, по крайней мере, в Oracle стандартные строковые функции и условия намного быстрее, чем их аналоги из регулярных выражений, и должны использоваться по возможности. По крайней мере, когда важна производительность; Я считаю, что это хорошая практика - использовать их, когда это возможно, даже когда производительность не важна, просто для формирования хороших привычек.
Здесь простое и эффективное решение, использующее только стандартные строковые функции: Абсолютно возможно и относительно просто.
select city
from station
where substr(city, 1, 1) not in ('A', 'E', 'I', 'O', 'U', 'a', 'e', 'i', 'o', 'u')
;
Конечно, это можно изменить различными способами; Например, мы могли бы использовать lower()
, чтобы избежать повторения гласных в верхнем и нижнем регистре. Или даже:
select city
from station
where 'aeiou' not like '%' || lower(substr(city, 1, ,1)) || '%'
;
, но я рассматриваю такой код (даже если иногда он может быть немного быстрее) как трюк; Лучше пусть код скажет именно то, что вы имеете в виду, как в первой версии. Я не уверен, что есть разница в производительности в любом случае. (Но обе версии должны быть намного быстрее, чем что-либо, использующее регулярные выражения, потому что регулярное выражение использует значительный механизм, независимо от того, насколько проста проблема.)
Обратите внимание, что в select
я пропустил "разные" пункт, поскольку это совершенно не связано с вопросом. Всегда старайтесь, чтобы вопросы были как можно более мелкими, и в то же время полностью отражали фактически задаваемый вопрос.