SQL с использованием регулярного выражения REGEXP_LIKE()
У меня возникли некоторые проблемы, когда я не могу выглядеть как регулярное выражение, совпадающее с 3 или более буквами "а" или "е" в названии.
Найдите всех менеджеров, которые управляют сотрудниками, по крайней мере, с 3 буквами "а" или "е" в названии (как прописными, так и строчными). Например, наличие 2 'a' и 1 'e' в названии будет удовлетворять критериям выбора
select manager_name
from manages
where regexp_like(employee_name, '[a,e]{3, }');
Когда я делаю это, он показывает правильный список с 'e' или 'a' в нем, но когда я пытаюсь сделать 3 или больше, он возвращает пустой набор. Также образец данных предоставлен ниже.
select manager_name
from manages
where regexp_like(employee_name, '[a,e]');
Пример данных
William Gates III
Lakshmi Mittal
Ingvar Kamprad
Lawrence Ellison
Mark Zuckerberg
Sheryl Sandberg
Liliane Bettencourt
Michael Dell
3 ответа
Вы ищете это вместо
(.*[ae]){3,}
.*
принимает различные символы между теми, кто хотел
Таким образом, ваш запрос становится:
select manager_name
from manages
where
regexp_like(employee_name, '(.*[ae]){3,}', 'i');
i
флаг для нечувствительного соответствия, поэтому заглавная AE
принимаются во внимание... Если опущено, выполняется чувствительное совпадение...
Вы также можете использовать просто {3}
вместо {3,}
, это даст те же результаты в этом случае
Если хочешь хотя бы 3 a
или e
где-нибудь в имени тогда:
select manager_name
from manages
where regexp_like(employee_name, '(.*?[ae]){3,}', 'i' );
Если вы хотите по крайней мере 3 подряд a
или e
тогда:
select manager_name
from manages
where regexp_like(employee_name, '.*[ae]{3,}', 'i' );
Вы можете попробовать использовать REGEXP_COUNT()
вместо REGEXP_LIKE()
:
SELECT manager_name
FROM manages
WHERE REGEXP_COUNT(employee_name, '[ae]', 1, 'i') >= 3;
Значение третьего параметра в REGEXP_COUNT()
указывает позицию, с которой должен начинаться поиск (в данном случае мы хотим начать с начала), а match_parameter 'i'
указывает, что поиск должен быть без учета регистра.
REGEXP_COUNT()
был добавлен с Oracle 11g; Если вы используете более раннюю версию Oracle, то можете попробовать следующее:
SELECT manager_name
FROM manages
WHERE REGEXP_INSTR(employee_name, '[ae]', 1, 3, 0, 'i') > 0;
Четвертый параметр выше (3
) - номер вхождения регулярного выражения.
или же:
SELECT manager_name
FROM manages
WHERE REGEXP_SUBSTR(employee_name, '[ae]', 1, 3, 'i') IS NOT NULL;
В любом случае это делает регулярное выражение проще, чем если бы вы использовали REGEXP_LIKE()
,