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(),

Другие вопросы по тегам