Skip to Content

模式匹配

Extreme DPS 支持使用 LIKE 运算符以及正则表达式来进行模式匹配。


LIKE

基于与模式的比较对字符串进行区分大小写的匹配。

请注意,LIKE 不支持非确定性排序规则。如需规避此限制,可以在表达式上使用不同的排序规则。

语法

<string> LIKE <pattern> [ESCAPE <escape-character>] <string> NOT LIKE <pattern> [ESCAPE <escape-character>]

参数

  • <string>

    用于匹配模式的字符串。它可以是 varchartext 类型。

  • <pattern>

    要匹配的模式。它可以是 varchartext 类型。

  • <escape-character>

    转义字符,插入在通配符字符前的一个或多个字符,表示该通配符必须被解释为一个常规字符,而不是一个通配符。

示例

LIKE 示例:

'john' LIKE 'john' → true 'john' LIKE '%o%' → true 'john' LIKE '_oh_' → true 'john' LIKE 'tom' → false 'john' LIKE NULLNULL NULL LIKE '%abc%'NULL

输出值说明:

  • true<string><pattern> 匹配。

  • false<string><pattern> 不匹配。

  • NULL<string><pattern> 为 null。

NOT LIKE 示例:

'john' NOT LIKE 'john' → false 'john' NOT LIKE '%o%' → false 'john' NOT LIKE '_oh_' → false 'john' NOT LIKE 'tom' → true 'john' NOT LIKE NULLNULL NULL NOT LIKE '%abc%'NULL

输出值说明:

  • true<string><pattern> 不匹配。

  • false<string><pattern> 匹配。

  • NULL<string><pattern> 为 null。

使用注意事项

LIKE 模式匹配总是覆盖整个字符串。因此,如果需要匹配字符串中的一个序列,需要在模式的开始和结束处都使用百分号 (%)。

要匹配实际的下划线 (_) 或百分号 (%) 而不匹配其他字符,<pattern> 中的相应字符必须前置转义字符。默认的转义字符是反斜杠 ()。你可以使用 ESCAPE 子句指定适合你需求的转义字符。要匹配转义字符本身,需要连续写两个转义字符。

?>提示
如果你禁用了 standard_conforming_strings,你需要在字面字符串常量中双引号反斜杠 (\)。

要禁用转义机制,使用 [NOT] LIKE ... ESCAPE ''

你可以使用关键字 ILIKE 替代 LIKE,使匹配根据活动区域设置进行不区分大小写。

下表描述了可以在 LIKE 模式匹配中使用的每个关键字的等效运算符。

关键字等效运算符
LIKE~~
ILIKE~~*
NOT LIKE!~~
NOT ILIKE!~~*

Extreme DPS 支持使用 LIKEILIKENOT LIKENOT ILIKE 作为运算符,可以在 <expression> <operator> ANY (<subquery>) 结构中使用。唯一的区别是,在此类结构中,不能包含 ESCAPE 子句。在极少数情况下,你不能使用这些关键字替代其对应的运算符。


正则表达式函数

正则表达式函数是用于执行于正则表达式(即 regex)匹配的操作的字符串函数。

支持的正则表达式函数列表

Extreme DPS 支持使用正则表达式函数来进行模式匹配,如下表所示:

函数返回类型描述
REGEXP_REPLACE(subject text, pattern text)text将指定字符串 <subject> 中与 <pattern> 匹配的所有子字符串替换为空。
REGEXP_REPLACE(subject text, pattern text [, replacement text])text将指定字符串 <subject> 中与 <pattern> 匹配的所有子字符串替换为 <replacement> 指定的字符串。
REGEXP_LIKE(subject text, pattern text)boolean如果指定字符串 <subject><pattern> 匹配,则返回为真。
REGEXP_EXTRACT(subject text, pattern text)text返回指定字符串 <subject> 中与 <pattern> 匹配的第一个子字符串。
REGEXP_EXTRACT(subject text, pattern text, group integer)text找到指定字符串 <subject> 中与 <pattern> 匹配的第一个子字符串并返回指定组号 <group> 的文本。

示例

-- REGEXP_REPLACE(subject text, pattern text) 示例 SELECT REGEXP_REPLACE('fun stuff.', '[a-z]') → ' .' SELECT REGEXP_REPLACE('call 555.123.4444 now', '(\d{3})\.(\d{3}).(\d{4})') → 'call now' -- REGEXP_REPLACE(subject text, pattern text [, replacement text]) 示例 SELECT REGEXP_REPLACE('fun stuff.', '[a-z]', '*') → '*** *****.' SELECT REGEXP_REPLACE('call 555.123.4444 now', '(\d{3})\.(\d{3}).(\d{4})', '($1) $2-$3') → 'call (555) 123-4444 now' -- REGEXP_LIKE(subject text, pattern text) 示例 SELECT REGEXP_LIKE('Stevens', 'Ste(v|ph)en') → true SELECT REGEXP_LIKE('Hello', '^[a-zA-Z]+$') → true SELECT REGEXP_LIKE('12345', 'x') → true -- REGEXP_EXTRACT(subject text, pattern text) 示例 SELECT REGEXP_EXTRACT('Hello world bye', '\b[a-z]+') → 'world' SELECT REGEXP_EXTRACT('12345', 'x') → null -- REGEXP_EXTRACT(subject text, pattern text, group integer) 示例 SELECT REGEXP_EXTRACT('Hello world bye', '\b[a-z](/[a-z]*)', 1) → 'orld' SELECT REGEXP_EXTRACT('rat cat\nbatdog', 'gg(.)|ba(.)(.)', 2) → 't'