首批通过分布式安全可靠测评,为关键业务系统打造
模式匹配条件
更新时间:2026-07-15 22:01:31
模式匹配条件(Pattern-matching Condition)用来比较字符数据。
模式匹配条件类型包括 LIKE 条件和 REGEXP_LIKE 条件。
LIKE 条件
LIKE 条件用于模式匹配。相等运算符(=)指的是一个字符值与另一个字符值完全匹配,而 LIKE 条件通过在第一个值中搜索由第二个字符值指定的模式来将一个字符值的一部分与另一个字符值进行匹配。
LIKE 使用输入字符集定义的字符来计算字符串。
LIKE 条件语法
char1 [NOT] LIKE char2 [ ESCAPE esc_char ]
说明
当 LIKE 条件中包含"||"字符时,可以将其作为字符串连接操作符。
参数解释
| 参数 | 说明 |
|---|---|
| char1 | 字符表达式,例如字符列,称为搜索值。 |
| char2 | 字符表达式,通常是字面量,称为模式。 |
| esc_char | 字符表达式,通常是字面量,ESCAPE 将 esc_char 标识为转义字符。当转义符置于模式匹配符之前时,该模式匹配符被解释为普通的字符。 |
使用说明
如果未指定 esc_char,则没有默认转义字符。如果 char1、char2 或 esc_char 中的任何一个为 NULL,则结果未知。否则,转义字符(如果指定)必须是长度为 1 的字符串。
所有字符表达式(char1、char2 和 esc_char)都可以是任何数据类型,例如 CHAR、VARCHAR2、NCHAR 或 NVARCHAR2。如果它们的数据类型不同,则 OceanBase 数据库将它们全部转换为 char1 的数据类型。
模式可以包含如下特殊的模式匹配字符:
下划线 (_) 表示正好匹配值中的一个字符(而不是多字节字符集中的一个字节)。
百分号 (%) 表示可以匹配值中的零个或多个字符(与多字节字符集中的字节相反)。模式"%"不能匹配 NULL。
LIKE检测到无通配符时可以转换成=,例如SELECT * FROM t1 WHERE c1 LIKE 'ABC';等价于 “filter("c1"='abc')”。
您可以使用 ESCAPE 子句在模式中包含实际字符 % 或 _。如果转义字符位于模式中的字符 % 或 _ 之前,则 OceanBase 数据库在模式中按字面意思解释该字符,而不是将其作为特殊的模式匹配字符。您还可以搜索转义字符本身。例如,如果 @ 是转义字符,那么您可以使用 @@ 来搜索 @。
说明
只有 ASCII 等效的下划线 (_) 和百分比 (%) 字符被识别为模式匹配字符。它们在 East Asian 字符集和 Unicode 中的全角变体被视为普通字符。
如下示例中,如果 x [不] 匹配模式 y,则为 TRUE。在 y 中,字符 % 匹配零个或多个字符的任意字符串,但 NULL 除外;字符 _ 匹配任何单个字符。除了百分比 (%) 和下划线 (_) 之外,任何字符都可以跟随在 ESCAPE 之后。如果前面有转义字符,则通配符将被视为字面量。
x [NOT] LIKE y [ESCAPE 'z']
示例
以下语句使用了 LIKE 条件,ESCAPE '\' 会将 %A\_B% 中 \ 后面的模式匹配符'_'解释为普通的字符。
SELECT last_name FROM emp WHERE last_name LIKE '%A\_B%' ESCAPE '\' ORDER BY last_name;
REGEXP_LIKE 条件
REGEXP_LIKE 用于正则表达式匹配。REGEXP_LIKE 使用输入字符集定义的字符评估字符串。
REGEXP_LIKE 条件语法
REGEXP_LIKE(source_char, pattern [, match_param ])
参数解释
| 参数 | 说明 |
|---|---|
| source_char | 用作搜索值的字符表达式,数据类型可以是 CHAR、VARCHAR2、NCHAR、NVARCHAR2 或 CLOB。 |
| pattern | 正则表达式,通常是文本字面量,数据类型可以是 CHAR、VARCHAR2、NCHAR 或 NVARCHAR2。 |
| match_param | 是一个数据类型 VARCHAR2 或 CHAR 的字符表达式,用于更改条件的默认匹配行为。 |
使用说明
pattern 最多可以包含 512 个字节。如果 pattern 的数据类型与 source_char 的数据类型不同,则OceanBase 数据库将 pattern 转换为 source_char 的数据类型。
您可以为 match_parameter 指定以下一个或多个值:
'i'指定不区分大小写的匹配。'c'指定区分大小写的匹配。'n'允许句点 (.) 来匹配换行符。如果省略此参数,则句点与换行符不匹配。'm'表示将源字符串视为多行。OceanBase 数据库将^和$分别解释为源字符串中任意行的开头和结尾,而不是仅局限在整个源字符串的开头或结尾处。如果省略此参数,则 OceanBase 数据库将源字符串视为单行。'x'表示忽略空白字符。默认情况下,空白字符与自身匹配。
如果您为 match_parameter 指定多个相互矛盾的值,则 OceanBase 数据库使用最后一个值。例如,如果您指定 'ic',则 OceanBase 数据库使用区分大小写的匹配。如果您指定的字符不属于上述值,则将返回错误。
如果省略 match_parameter,则遵从以下匹配规则:
默认区分大小写由
NLS_SORT系统变量的值决定。句点 (.) 与换行符不匹配。
源字符串被视为单行。
示例
创建表 emp,并向里面插入数据。
CREATE TABLE emp(manager_id INT, first_name varchar(50), last_name varchar(50), hiredate varchar(50),SALARY INT);
INSERT INTO emp VALUES(300, 'Steven', 'King', '2019-09-11',23600);
INSERT INTO emp VALUES(200, 'Steven', 'Markle', '2019-11-05', 23800);
INSERT INTO emp VALUES(100, 'Deven', 'Part', '2018-10-01',24000);
INSERT INTO emp VALUES(200, 'Carlos', 'Ross', '2019-06-11',23500);
INSERT INTO emp VALUES(200, 'Teven', 'Bell', '2019-05-25', 23000);
INSERT INTO emp VALUES(200, 'Stephen', 'Stiles', '2018-06-11',24500);
INSERT INTO emp VALUES(100, 'Ame', 'De Haan', '2018-05-01',11000);
INSERT INTO emp VALUES(100, 'Jon', 'Errazuriz', '2017-07-21', 1400);
COMMIT;
查询返回名字为 Steven 或 Stephen 的员工的名字和姓氏(其中 first_name 以 Ste 开头,以 en 结尾,中间是 v 或 ph )。
obclient> SELECT first_name, last_name FROM emp WHERE REGEXP_LIKE (first_name, '^Ste(v|ph)en$')
ORDER BY first_name, last_name;
+------------+-----------+
| FIRST_NAME | LAST_NAME |
+------------+-----------+
| Stephen | Stiles |
| Steven | King |
| Steven | Markle |
+------------+-----------+
3 rows in set
查询返回姓氏中带有双元音的员工的姓氏(其中 last_name 包含两个相邻的 a、e、i、o 或 u,不区分大小写)。
obclient> SELECT last_name
FROM emp
WHERE REGEXP_LIKE (last_name, '([aeiou])\1', 'i')
ORDER BY last_name;
+-----------+
| LAST_NAME |
+-----------+
| De Haan |
+-----------+
1 row in set