LIKE 谓词
LIKE 谓词用于搜索具有特定模式的字符串。
匹配表达式是待测试的字符串,以确定其是否符合模式表达式中指定的模式。 除非指定转义表达式 ,否则图案中的下划线和百分号字符具有特殊含义,而非其字面含义。 更多信息,请参阅模式表达的描述。
以下规则总结了如何评估 m LIKE p 形式的谓词:
- 如果 m 或 p 为空,谓词的结果未知。
- 如果 m 和 p 都为空,则谓词的结果为真。
- 如果 m 为空,而 p 不为空,则谓词的结果未知,除非 p 由百分号或多个百分号组成。
- 如果 m 不为空而 p 为空,则谓词的结果为假。
- 否则,如果 m 与p中的模式匹配,则谓词的结果为真。 模式表达式描述详细解释了如何匹配模式,以评估谓词的真假。
当启用 LIKE 空白不重要行为时,匹配模式以评估谓词的方式会发生变化。 更多信息,请参阅 “喜欢”空白无意义行为子系统参数。
匹配表达式、 模式表达式和转义表达式的值必须都是字符或图形字符串,或者两者兼而有之,或者都是二进制字符串(BLOB)。 这些表达式都不能产生一个明确的类型;然而,表达式可以是一个函数,将一个明确的类型转换为它的源类型。
每个参数支持的表达略有不同。 每个参数的描述都列出了支持的表达式。
- 匹配表达
- 用于指定字符串是否符合特定字符模式的表达式。
- LIKE 模式表达
- 用于指定要匹配的字符模式的表达式。
该表达式可用以下任意一种方式指定:
- 常量
- 专用寄存器
- 变量
- 一个标量函数,其参数可以是上述任意一个(但不能使用嵌套函数调用)
- 数组元素说明
- CAST 规范,其参数可以是上述任意一个
- 连接(使用CONCAT或||)上述任何一项的表达式
表达还必须符合以下限制:
- 图案表达的最大长度不得超过4000字节。
- 如果模式表达式中使用宿主变量,则该宿主变量必须根据声明字符串宿主变量的规则进行定义,且不能是结构体。 有关特定编程语言中宿主变量的更多信息,请参阅宿主变量。
- 如果指定了转义表达式 , 则模式表达式不得包含转义表达式所标识的转义字符,除非紧接转义字符“%”或“_”。例如,如果“+”是转义字符,则模式中除“++”、“+_”或“+ %' i ”之外的任何“+”都是错误的。
该模式用于指定匹配表达式中值的符合性标准,其中:
- 下划线(_)代表任何单个字符。
- 百分号 (%) 表示零个或零个以上字符的字符串。
- 其他任何字符都代表其自身的一次出现。
如果模式表达式必须包含下划线或百分号,则使用转义表达式来指定一个字符,该字符将出现在模式中的下划线或百分号之前。 对于字符串,术语 “字符 ”、“百分号” 和 “下划线” 指的是SBCS字符。 对于图形字符串,术语指的是双字节字符或 UTF-16 字符。
如果模式以固定长度的字符串变量指定,则任何尾部空格都将被视为模式的一部分。 因此,最好使用一个长度可变的字符串变量,其实际长度与图案的长度相同。 如果宿主语言不允许使用长度可变的字符串变量,请将模式放在一个固定长度的字符串变量中,该变量的长度与模式的长度相同。
对模式的严格描述 :这种对模式的严格描述忽略了转义表达式的使用。
令m 表示匹配表达式的值, 令p 表示模式表达式的值。 字符串 p 被解释为最小子串说明符序列,因此 p 的每个字符都恰好属于一个子串说明符。 子字符串说明符是下划线、百分号或除下划线和百分号之外的任何非空字符序列。
如果m 或 p 为空值,则谓词的结果未知。 否则,结果要么是真的,要么是假的。 如果 m 和 p 都是空字符串,或者存在将m 分割成子字符串的分区,使得:
- 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)等效。混合数据模式 :如果匹配表达式表示混合数据,则模式被假定为混合数据。 对于ASCII和EBCDIC,模式中的特殊字符解释如下:
- SBCS下划线表示一个SBCS字符。
- DBCS下划线表示一个MBCS字符。
- 百分号(SBCS或DBCS)表示由零个或多个SBCS或MBCS字符组成的字符串。
对于EBCDIC, 匹配表达式或模式表达式中的冗余移位字节将被忽略。
对于Unicode,图案中的特殊字符解释如下:
- SBCS或DBCS下划线指的是一个字符(SBCS或MBCS)。
- 百分号(SBCS或DBCS)表示由零个或多个SBCS或MBCS字符组成的字符串。
当LIKE谓词与Unicode数据一起使用时,Unicode百分号和下划线使用下表中所示的代码点:全角或半角“%”可匹配零个或多个字符。 全角或半角字符只能匹配一个字符。 (对于ASCII或EBCDIC数据,全角_字符与DBCS字符匹配。)字符 UTF-8 UTF-16 半角 % X'25' X'0025' 全角 % X' EFBC85 ' X' FF05 ' 半角_ X'5F' X'005F' 全角_ X'EFBCBF' X'FF3F' 二进制数据模式 :对于包含二进制数据的列,模式包含字节。 图案中的特殊字节解释如下:
- SBCS下划线( X'6D' )占1个字节。
- SBCS百分号的代码点( X'6C' )是指任意字节数。
参数标记:
当LIKE子句中指定的模式是一个参数标记,并且使用一个固定长度的字符变量来替换参数标记时,请为变量指定一个正确长度的值。 如果您没有指定正确的长度,选择将不会返回预期的结果。
例如,如果变量被定义为 CHAR(10),并且值“WYSE %' i ”被分配给该变量,则在分配时,该变量会被空白填充。 使用的模式是“WYSE% ”,它要求 Db2 搜索以“WYSE”开头、以五个空格结尾的所有值, 除非 LIKE空白无效行为生效。 如果搜索仅限于以“WYSE”开头的值,则将值“WYSE%%%%%%”赋给变量。
- ESCAPE 逃避表达
- 用于指定转义字符的表达式,用于修改模式表达式中下划线(_)和百分号(%)的特殊含义。 指定一个表达式(可选)后,LIKE 谓词可以明确测试值中是否在您想要的字符位置包含 ' %' o r'_'。 转义字符由单个SBCS(1字节)或DBCS(2字节)字符组成。 对于Unicode混合( UTF-8 )数据,允许使用例外条款,但对于ASCII和EBCDIC混合数据,则不允许使用例外条款。
该表达式可以由以下方式指定:
- 常量
- 变量
- 一个标量函数,其参数可以是上述任意一个(但不能使用嵌套函数调用)
- CAST 规范,其参数可以是上述任意一个
以下规则也适用于使用 ESCAPE 条款和转义表达式 :
- 转义表达的结果必须是一个SBCS或DBCS字符或一个包含1字节的二进制字符串。
- 如果匹配表达式是混合数据,则不能使用该 ESCAPE 如果匹配表达式是混合数据,则不能使用该子句。
- 如果主机变量指定了转义表达式 ,则必须根据声明固定长度字符串主机变量的规则定义该主机变量。注意 :如果以NUL字符结尾,则可以指定一个长度为2的C字符串变量。如果宿主变量有一个负指标变量,则谓词的结果未知。
- 该模式不得包含转义字符,除非转义字符后面紧跟着转义字符,即“ %' o r”或“_”。例如,如果“+”是转义字符,则模式中除“++”、“+_”或“+ %' i ”以外的任何“+”都是错误。
下表显示了连续出现的转义字符(此处为加号(+))的效果。表 1. 连续出现转义字符的影响 当模式字符串为…… 实际模式是...... +%百分号 ++%一个加号后跟零或任意多个字符 +++%加号后跟百分号
示例
- 示例 1
- 当在 NAME 中要测试的字符串的值为 SMITH、NESMITH、SMITHSON 或 NESMITHY 时,以下谓词为真。 当字符串的值为SMYTHE时,该语句为假:
NAME LIKE '%SMITH%' - 示例 2
- 在下面的谓词中,名为PATTERN的主变量保存了模式的字符串:
假设PATTERN中的字符串具有以下值:NAME LIKE :PATTERN ESCAPE '+'AB+_C_%请注意,在这个字符串中,第一个下划线前的加号是一个转义字符。 当在 NAME 中测试的字符串值为 AB_CD 或 AB_CDE 时,谓词为真。 当字符串的值为AB、AB_或AB_C时,则为错误。
- 示例 3
- 以下两个谓词是等价的;第一个谓词中百分之四的符号中有三个是多余的。
NAME LIKE 'AB%%%%CD' NAME LIKE 'AB%CD' - 示例 4
- 假设存在一个名为ZIP_TYPE的独立类型,其源数据类型为CHAR(5),并且某个表TABLEY中存在一个数据类型为ZIP_TYPE的ADDRZIP列。 如果邮政编码(ADDRZIP)以“9555”开头,则以下语句将选择该行。
SELECT * FROM TABLEY WHERE CHAR(ADDRZIP) LIKE '9555%' - 示例 5
- 示例表 DSN8C10.EMP_PHOTO_RESUME 中的简历列被定义为 CLOB。 当字符串JONES出现在“简历”列中的任意位置时,以下语句将选择该列。
SELECT RESUME FROM DSN8C10.EMP_PHOTO_RESUME WHERE RESUME LIKE '%JONES%' - 示例 6
在下表中,假设 COL1 是包含混合EBCDIC数据的列。 下表显示了当使用第二列中的 COL1 值对第一列中的谓词进行求值时得到的结果:
- 示例 7
- 在下表中,假设 COL1 是包含混合ASCII数据的列。 下表显示了当使用第二列中的 COL1 值对第一列中的谓词进行求值时得到的结果:
- 示例 8
- 在下表中,假设 COL1 是包含Unicode数据的列。 下表显示了当使用第二列中的 COL1 值对第一列中的谓词进行求值时得到的结果:
表 2. COL1 包含Unicode数据 谓词 COL1 价值观 结果 COL1 在哪里喜欢 'aaaAB%C 'aaaABDZC' 是 'aaaABdzxC' 是 空字符串 错 COL1 喜欢 ''aaaAB %C' 'aaaABDZC' 是 'aaaABdzxC' 是 空字符串 错 COL1 喜欢'' 'aaaABDZC' 错 'aaaABdzxC' 错 空字符串 是 COL1 喜欢 '%' 'aaaABDZC' 是 'aaaABdzxC' 是 空字符串 是 COL1 在何处喜欢 ' %' 'aaaABDZC' 是 'aaaABdzxC' 是 空字符串 错 COL1 喜欢 ' ' 'aaaABDZC' 错 'aaaABdzxC' 错 空字符串 错
喜欢空白 无足轻重的行为子系统参数
当启用 LIKE_BLANK_INSIGNIFICANT 子系统参数时,固定长度字符串末尾的所有空格都会被忽略。 这种行为被称为 “喜欢”无关紧要的行为。 LIKE 空白重要行为,其中固定长度字符串末尾的空白是重要的(不会被忽略),是安装或迁移期间的默认行为。 对于可变长度的字符串,空格很重要。
当您设置LIKE_BLANK_INSIGNIFICANT子系统参数时,在绑定或准备SQL查询语句后,下次执行带有LIKE谓词的语句时,LIKE空白不重要行为将生效。 如果语句未准备好或未绑定,则无论子系统参数设置如何,LIKE行为都会表现出LIKE空白显著行为。
对于以下接口,启用或禁用“LIKE”空白不重要行为会立即生效。 这适用于显式LIKE谓词(例如UNLOAD)和隐式LIKE谓词(例如表检查约束)。
- INSERT
- UPDATE
MERGE
- UNLOAD
- 重组
- LOAD
- 检查数据
在应用“赞”谓词之前,字符或图形列中的任何尾部空格都会被删除,保留最后一个非空格字符。 如果列中全部为空格,则字符位置1处的空格不会被删除。 剥离后,对剥离后的列数据应用LIKE谓词。
以下示例中, b 代表空字符,展示了当启用“LIKE blank insignificant behavior”时,如何评估“LIKE”谓词。
SELECT C1
FROM T1
WHERE C1 LIKE '%xyz';
这个LIKE谓词将匹配以下固定长度的字符串:
- ABCXYZ
- abcxyzb
- abcxyzbb
- abcxyzbb..b'
虽然列数据中的尾随空格无关紧要,但LIKE谓词中的尾随空格却很重要。 以下示例中,b 代表空格字符,适用于当 LIKE 谓词包含一个或多个尾部空格时。
SELECT C1
FROM T1
WHERE C1 LIKE '%xyzbb';
此LIKE谓词不匹配以下固定长度的字符串:
- ABCXYZ
- abcxyzb
- abcxyzbb
- abcxyzbbb
以下示例适用于LIKE谓词在最后一个位置包含一个或多个单个字符(_)的情况。
SELECT C1
FROM T1
WHERE C1 LIKE '%xyz_';
这个LIKE谓词与以下固定长度的字符串不匹配,因为它们都被简化为“abcxyz”字符串:
- ABCXYZ
- abcxyzb
- abcxyzbb
- abcxy zbb..b
以下示例适用于LIKE谓词在最后一个位置包含多个字符(_)的情况。
SELECT C1
FROM T1
WHERE C1 LIKE '%xyz__';
此LIKE谓词不匹配以下固定长度的字符串:
- ABCXYZ
- abcxyzb
- abcxyzbb
- abcxy zbb..b
以下示例适用于当LIKE谓词包含多个单个字符(_)且最后一个位置是零个或多个字符(%)的字符串时。
SELECT C1
FROM T1
WHERE C1 LIKE '%xyz_%_';
This
此LIKE谓词不匹配以下固定长度的字符串:
- ABCXYZ
- abcxyzb
- abcxyzbb
- abcxy zbb..b
如果列数据包含所有空格,则在应用 LIKE 谓词之前,除字符位置 1 处的空格外,其他所有空格都会被删除。 例如,CHAR(6)列包含以下值:
bbbbbb
以下LIKE谓词将匹配:
- 喜欢 “b ”
- 喜欢 '_'
- 喜欢 '%'
以下LIKE谓词不匹配:
- 喜欢 “bbbbbbb”
- 喜欢 “bbbb___”
- 喜欢“_______”
