SQL 使用正则表达式 REGEXP_LIKE()

SQL using regular expression REGEXP_LIKE()

我遇到了一些问题,我似乎无法使用正则表达式来匹配名称中的 3 个或更多个 a 或 e。

查找管理名称中至少包含 3 个字母 'a' 或 'e' 的员工的所有经理(均为大写 和小写)。例如名称中有 2 'a' 和 1 'e',将满足选择标准

select manager_name
  from manages
 where regexp_like(employee_name, '[a,e]{3, }');

当我这样做时,它会显示一个包含 'e' 或 'a' 的正确列表,但是当我尝试执行 3 个或更多时,它会 returns 空白集。下面还提供了示例数据。

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

你正在寻找这个

(.*[ae]){3,}

.* 接受想要的字符之间的不同字符

因此您的查询变为:

select manager_name
  from manages
  where 
  regexp_like(employee_name, '(.*[ae]){3,}', 'i');

i标志用于不敏感匹配,因此考虑大写AE...如果省略,则执行敏感匹配...

您也可以简单地使用 {3} 而不是 {3,},在这种情况下它会产生相同的结果

如果您希望名称中至少有 3 个 ae,则:

select manager_name
from   manages
where  regexp_like(employee_name, '(.*?[ae]){3,}', 'i' );

如果您想要至少 3 个连续的 ae,则:

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

更简单