类别:

字符串函数(正则表达式)

[ NOT ] RLIKE

执行比较以确定字符串是否与指定模式相匹配。两个输入都必须是文本表达式。

RLIKE 与 [ NOT ] LIKE 函数类似,但使用 POSIX 扩展的正则表达式而不是 SQL LIKE 模式语法。它支持比 LIKE 更复杂的匹配条件。

小技巧

您可以使用搜索优化服务,提高用于调用此函数的查询的性能。有关详细信息,请参阅 搜索优化服务

别名:

[ NOT ] REGEXP (第 2 种语法)、REGEXP_LIKE (第 1 种语法)

另请参阅:字符串函数(正则表达式)

语法

-- 1st syntax
RLIKE( <subject> , <pattern> [ , <parameters> ] )

-- 2nd syntax
<subject> [ NOT ] RLIKE <pattern>
Copy

实参

必填:

subject

以匹配为准。

pattern

要匹配的模式。

可选:

parameters

包含一个或多个字符的字符串,指定用于搜索匹配项的参数。支持的值:

cimes

有关更多详细信息,请参阅 为正则表达式指定参数

默认:c

返回

返回 BOOLEAN 或 NULL。

  • 指定 RLIKE 时,如果存在匹配项,则值为 TRUE。否则返回 FALSE。

  • 指定 NOT RLIKE 时,如果没有匹配项,则值为 TRUE。否则返回 FALSE。

  • 当指定 RLIKE 或 NOT RLIKE 时,如果任何实参为 NULL,则返回 NULL。

使用说明

排序规则详细信息

Arguments with collation specifications are currently not supported.

示例

运行以下命令,为本主题中的示例设置数据:

CREATE OR REPLACE TABLE rlike_ex(city varchar(20));
INSERT INTO rlike_ex VALUES ('Sacramento'), ('San Francisco'), ('San Jose'), (null);
Copy

第一种语法

以下示例使用通配符执行不区分大小写的模式匹配:

SELECT * FROM rlike_ex WHERE RLIKE(city, 'san.*', 'i');
Copy
+---------------+
| CITY          |
|---------------|
| San Francisco |
| San Jose      |
+---------------+
SELECT * FROM rlike_ex WHERE NOT RLIKE(city, 'san.*', 'i');
Copy
+------------+
| CITY       |
|------------|
| Sacramento |
+------------+

以下示例确定字符串是否与电话号码和电子邮件地址的格式匹配。在这些示例中,正则表达式在 放在美元符号内的字符串 中指定,以避免将正则表达式中的反斜杠转义。

SELECT RLIKE('800-456-7891', $$[2-9]\d{2}-\d{3}-\d{4}$$) AS matches_phone_number;
Copy
+----------------------+
| MATCHES_PHONE_NUMBER |
|----------------------|
| True                 |
+----------------------+
SELECT RLIKE('jsmith@email.com',$$\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$$) AS matches_email_address;
Copy
+-----------------------+
| MATCHES_EMAIL_ADDRESS |
|-----------------------|
| True                  |
+-----------------------+

以下示例执行相同的匹配,但使用 放在单引号内的字符串常量 来指定正则表达式。

由于示例使用放在单引号内的字符串常量,因此:ref:每个反斜杠都必须用另一个反斜杠进行转义<label-regexp_escape_character_caveats>

-- Escape the backslash character (\) in \w and \d

SELECT RLIKE('800-456-7891','[2-9]\\d{2}-\\d{3}-\\d{4}') AS matches_phone_number;
Copy
+----------------------+
| MATCHES_PHONE_NUMBER |
|----------------------|
| True                 |
+----------------------+
SELECT RLIKE('jsmith@email.com','\\w+@[a-zA-Z_]+?\\.[a-zA-Z]{2,3}') AS matches_email_address;
Copy
+-----------------------+
| MATCHES_EMAIL_ADDRESS |
|-----------------------|
| True                  |
+-----------------------+

或者重写语句,避免使用依赖反斜杠字符的序列。

SELECT RLIKE('800-456-7891','[2-9][0-9]{2}-[0-9]{3}-[0-9]{4}') AS matches_phone_number;
Copy
+----------------------+
| MATCHES_PHONE_NUMBER |
|----------------------|
| True                 |
+----------------------+
SELECT RLIKE('jsmith@email.com','[a-zA-Z_]+@[a-zA-Z_]+?\\.[a-zA-Z]{2,3}') AS matches_email_address;
Copy
+-----------------------+
| MATCHES_EMAIL_ADDRESS |
|-----------------------|
| True                  |
+-----------------------+

第二种语法

区分大小写的模式匹配:

SELECT * FROM rlike_ex WHERE city RLIKE 'San.* [fF].*';
Copy
+---------------+
| CITY          |
|---------------|
| San Francisco |
+---------------+

其他示例

有关正则表达式的其他示例,请参阅 [ NOT ] REGEXP

语言: 中文