LIKE 谓词
LIKE 谓词搜索具有特定模式的字符串。 该模式由一个字符串指定,在该字符串中,下划线和百分号可能具有特殊含义。 模式中的尾部空格是该模式的一部分。
如果任何自变量的值为空,那么 LIKE 谓词的结果未知。
match-expression, pattern-expression和 escape-expression 的值是兼容的字符串表达式。 每个自变量支持的字符串表达式类型略有不同。 在每个参数的描述下列出了有效的表达式类型。
没有任何表达式可以生成单值类型。 但是,它可以是将单值类型强制转换为其源类型的函数。
- 匹配表达式
- 一个表达式,用于指定要检查的字符串,以确定该字符串是否符合特定字符模式。
- LIKE 模式表达式
- 用于指定要匹配的字符串的表达式。可以使用与 match-expression 相同的方式指定表达式,但存在以下限制:
- 表达式中没有类型为 CLOB 或 DBCLOB 的元素。 另外,它不能是 BLOB 文件引用变量。
- pattern-expression 的实际长度不能超过 32 672 字节。
使用 LIKE 谓词的 简单描述 是该模式用于指定 match-expression中的值的一致性条件,其中:- 下划线字符 (_) 表示任何单个字符。
- 百分号(%)表示一个包含零个或零个以上字符的字符串。
- 任何其他字符表示自身。
如果 pattern-expression 需要包含下划线或百分号字符,那么 escape-expression 用于指定要在该模式中的下划线或百分号字符之前的字符。
以下是使用 LIKE 谓词的 严格描述 。 请注意,此描述将忽略 escape-expression的使用; 稍后将覆盖其使用。- 让 m 表示 match-expression 的值,让 p 表示 pattern-expression的值。 字符串 p 解释为最小子串说明符数的序列,因此 p 的每个字符都正好是一个子串说明符的一部分。 子串说明符是下划线,百分号或除下划线或百分号以外的任何非空字符序列。如果 m 或 p 是空值,那么谓词的结果未知。 否则,结果为 true 或 false。 如果 m 和 p 都是空字符串,或者存在将 m 分区为子字符串的情况,那么结果为 true:
- m 的子串是零个或多个连续字符的序列, m 的每个字符都是正好一个子串的一部分。
- 如果 n第一个子串说明符是下划线,那么 m 的 n第一个子串是任何单个字符。
- 如果 n第一个子串说明符是百分号,那么 m 的 n第一个子串是任何由零个或多个字符组成的序列。
- 如果 n第一个子串说明符既不是下划线也不是百分号,那么 m 的 n第一个子串等于该子串说明符,并且其长度与该子串说明符相同。
- m 的子串数与子串说明符数相同。
因此,如果 p 是空字符串,而 m 不是空字符串,那么结果为 false。 同样,如果 m 是空字符串,而 p 不是空字符串 (仅包含百分号的字符串除外) ,那么结果为 false。
谓词 m NOT LIKE p 等同于搜索条件 NOT (m LIKE p)。
指定 escape-expression 时, pattern-expression 不得包含由 escape-expression标识的转义字符,除非后面紧跟转义字符,下划线字符或百分号字符 (SQLSTATE 22025)。
如果 match-expression 是 MBCS 数据库中的字符串,那么它可以包含混合数据。 在这种情况下,模式可以同时包含 SBCS 和非 SBCS 字符。 对于非 Unicode 数据库,模式中的特殊字符解释如下:- SBCS 半宽下划线指的是一个 SBCS 字符。
- 非 SBCS 全宽下划线是指一个非 SBCS 字符。
- SBCS 半宽或非 SBCS 全宽百分号是指零个或多个 SBCS 或非 SBCS 字符。
在 Unicode 数据库中,
single-byte
和non-single-byte
字符之间确实没有区别。 虽然 UTF-8 格式是 Unicode 字符的混合字节
编码,但在 UTF-8中 SBCS 和非 SBCS 字符之间没有真正的区别。 每个字符都是 Unicode 字符,而不考虑 UTF-8 格式的字节数。在Unicode图形字符集中,每个非补充字符(包括半角下划线字符 U&'\005F' 和半角百分号字符U&'\0025')的宽度均为两个字节。 在 Unicode 数据库中,模式中的特殊字符解释如下:- 对于字符串,半角下划线字符( X'5F' )或全角下划线字符(X'EFBCBF')表示单个Unicode字符;半角百分号字符(X'25')或全角百分号字符(X' EFBC85 ')表示零个或多个Unicode字符。
- 对于图形字符串,半角下划线字符( U&'\005F' )或全角下划线字符( U&'\FF3F' )表示一个Unicode字符;半角百分号字符(U&'\0025')或全角百分号字符(U&' \FF05 ')表示零个或多个Unicode字符。
- 要在基于语言环境敏感的 UCA 的整理生效时识别为特殊字符,下划线字符和百分号字符不得后跟非间距组合标记 (diacritics)。 例如,模式 U&'%\0300'(百分号字符后跟非空格组合重音符号)将被解释为搜索
,而非搜索零个或多个 Unicode 字符后跟带重音符号的字母。
Unicode 补充字符存储为 Unicode 图形列中的两个图形代码点。 要与 Unicode 图形列中的 Unicode 补充字符匹配,如果数据库使用基于语言环境的 UCA 的整理,请使用一个下划线,否则请使用两个下划线。 要与 Unicode 字符列中的 Unicode 补充字符匹配,请对所有整理使用一个下划线。 要将基本字符与一个或多个尾部非间距组合字符匹配,如果数据库使用基于语言环境的 UCA 的整理,请使用一个下划线。 否则,请使用与非空格组合字符数和基本字符数一样多的下划线字符。
转义表达式 - 此可选参数是一个表达式,用于指定要用于修改 pattern-expression中下划线 (_) 和百分号 (%) 字符的特殊含义的字符。 这允许使用 LIKE 谓词来匹配包含实际百分比和下划线字符的值。表达式可以由下列任何一项指定:
- 常量
- 专用寄存器
- 全局变量
- 主变量
- 具有任何先前提及的操作数的标量函数
- 用于并置前面列示的任何项的表达式
带有如下限制:- 表达式中没有类型为 CLOB 或 DBCLOB 的元素。 此外,它不能是 BLOB 文件引用变量。
- 对于字符列,表达式的结果必须是一个字符,或者是一个只包含一个字节的二进制字符串 (SQLSTATE 22019)。
- 对于图形列,表达式的结果必须是一个字符 (SQLSTATE 22019)。
- 该表达式的结果不得为非间隔组合字符序列(例如 U&'\0301',组合尖音符)。
当模式字符串中存在转义字符时,下划线,百分号或转义字符可以表示自身的字面值。 如果所讨论的字符前面有奇数个连续转义字符,那么情况如此。 否则不成立。
在模式中,连续转义字符的序列按如下所示处理:- 设 S 为这样的序列,并假设 S 不是连续转义字符的较大序列的一部分。 还假设 S 总共包含 n 个字符。 那么管理 S 的规则取决于 n 的值:
- 如果 n 为奇数,那么 S 必须后跟下划线或百分号 (SQLSTATE 22025)。 S 及其后面的字符表示 (n-1)/2 转义字符的文字出现,后跟下划线或百分号的文字出现。
- 如果 n 是偶数,那么 S 表示转义字符的 n/2 字面值。 与 n 为奇数的情况不同, S 可以结束该模式。 如果它没有结束该模式,那么它可以后跟任何字符 (当然,除了一个转义字符,这将违反以下假设: S 不是连续转义字符的更大序列的一部分)。 如果 S 后跟下划线或百分号,那么该字符有其特殊含义。
以下是转义字符连续出现的影响的说明,在本例中,转义字符是反斜杠 (\)。- 模式字符串
- 实际模式 \%
- 百分号 \\%
- 后跟零个或零个以上任意字符的反斜杠 \\\%
- 反斜杠后跟百分号
- 从不转换 match-expression 值。
- 如果 pattern-expression 的代码页与 match-expression的代码页不同,那么 pattern-expression 的值将转换为 match-expression的代码页,除非操作数定义为 FOR BIT DATA 或为二进制类型 (在这种情况下不存在转换)。
- 如果 escape-expression 的代码页与 match-expression的代码页不同,那么 escape-expression 的值将转换为 match-expression的代码页,除非操作数定义为 FOR BIT DATA 或为二进制类型 (在这种情况下没有转换)。
注意
- 在 match-expression 和 pattern-expression中,尾部空格的数目都很重要。 如果字符串的长度不同,那么较短的字符串不会以空格填充。 例如,表达式
'PADDED ' LIKE 'PADDED'不会生成匹配项。 - 如果 LIKE 谓词中指定的模式是参数标记,并且使用固定长度字符主变量来替换参数标记,那么为主变量指定的值必须具有正确的长度。 如果未指定正确的长度,那么选择操作将不会返回预期结果。例如,如果主变量定义为 CHAR (10) ,并且将值 WYSE% 赋给该主变量,那么在赋值时将用空白填充该主变量。 使用的模式为:
数据库管理器将搜索以 WYSE 开头且以 5 个空格结尾的所有值。 如果要仅搜索以'WYSE% 'WYSE
开头的值,请将值WSYE%%%%%%分配给主变量。 - 除非任一操作数定义为 FOR BIT DATA (在这种情况下,将使用二进制比较来匹配该模式) ,否则将使用数据库的整理来匹配该模式。
示例
- 搜索在 PROJECT 表的 PROJNAME 列中的任何位置显示的字符串
SYSTEMS
。SELECT PROJNAME FROM PROJECT WHERE PROJECT.PROJNAME LIKE '%SYSTEMS%' - 搜索第一个字符为
J
的字符串,该字符串在 EMPLOYEE 表的 FIRSTNME 列中正好有两个字符长。SELECT FIRSTNME FROM EMPLOYEE WHERE EMPLOYEE.FIRSTNME LIKE 'J_' - 在 EMPLOYEE 表的 FIRSTNME 列中搜索任意长度的字符串,第一个字符为
J
。SELECT FIRSTNME FROM EMPLOYEE WHERE EMPLOYEE.FIRSTNME LIKE 'J%' - 在 CORP_SERVERS 表中,在 LA_SERVERS 列中搜索与 CURRENT SERVER 专用寄存器中的值匹配的字符串。
SELECT LA_SERVERS FROM CORP_SERVERS WHERE CORP_SERVERS.LA_SERVERS LIKE CURRENT SERVER - 检索表 T 的列 A 中以字符序列
_\
开头的所有字符串。SELECT A FROM T WHERE T.A LIKE '\_\\%' ESCAPE '\' - 使用二进制字符串常量来指定与匹配和模式数据类型 (两个 BLOB) 兼容的单字节转义字符。
SELECT COLBLOB FROM TABLET WHERE COLBLOB LIKE :pattern_var ESCAPE BX'0E' - 在使用不区分大小写的整理 CLDR181_LEN_S1定义的 Unicode 数据库中,查找以
Bill
开头的所有名称。
此查询将返回名称SELECT NAME FROM CUSTDATA WHERE NAME LIKE 'Bill%'Bill Smith
,billy simon
和Bill JONES
。
