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 个 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()
.
更简单
我遇到了一些问题,我似乎无法使用正则表达式来匹配名称中的 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 个 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()
.