LIKE 谓词

当某列的字符串值与指定模式匹配时,检索该行。该模式可能包括一个或多个通配符 (*)。

语法

string‑expression [ NOT ] { LIKE | ILIKE | LIKEB | ILIKEB } 'pattern' [ESCAPE 'escape‑character' ]

参数

替换符号

可将以下符号替换为 LIKE 及其变体:

模式匹配

LIKE 要求整个字符串表达式与 patten 匹配。要与字符串中的任意一序列字符匹配, patten 开头和结尾必须使用百分比符号。

LIKE 不会忽略尾部空格字符。如果要匹配的数据值以不确定量的空格结尾,请将通配符 % 附加到 pattern

LIKE 变体比较

LIKE 谓词符合 SQL 标准。Vertica 还支持多种非标准变体,特别是 ILIKE,该变体等同于 LIKE,但可执行不区分大小写的搜索。以下差异与 LIKE 及其变体有关:

  • LIKE 对 UTF-8 字符字符串执行操作。精确行为取决于排序规则参数,如强度。特殊情况下,ILIKE 在当前会话语言环境下设置 S=2 (不计大小写)。

  • LIKEILIKE 对字符字符串 稳定,但对二进制字符串 不可变,而 LIKEBILIKEB 在两种情况下都不可变。

  • LIKEBILIKEB 谓词挨个字节进行 ASCII 比较。

区域设置依赖关系

默认语言环境设置下,LIKEILIKE 挨个 UTF-8 字符进行比较,比较不区分语言环境设置。 ILIKE 将独立语言转换为小写。

在非默认区域设置下,LIKEILIKE 将字符串做对比,区分语言环境设置,包括为 VARCHAR 类型使用与 "=" 相同的算法进行自动标准化。

ESCAPE 对于非默认语言环境设置,表达式的求值结果恰好为一个八位字节或一个 UTF-8 字符。

示例

以下示例显示了区域的模式匹配。

\locale default=> CREATE TABLE src(c1 VARCHAR(100));
=> INSERT INTO src VALUES (U&'\00DF'); --The sharp s (ß)
=> INSERT INTO src VALUES ('ss');
=> COMMIT;

默认区域下查询 src 表返回 ss 和 sharp s。

=> SELECT * FROM src;
 c1
----
 ß
 ss
(2 rows)

下列查询结合了参数匹配谓词来返回 c1 列的结果:

=> SELECT c1, c1 = 'ss' AS equality, c1 LIKE 'ss'
   AS LIKE, c1 ILIKE 'ss' AS ILIKE FROM src;
 c1 | equality | LIKE | ILIKE
----+----------+------+-------
 ß  | f        | f    | f
 ss | t        | t    | t
(2 rows)

下一个查询指定 c1 的 unicode 格式。

=> SELECT c1, c1 = U&'\00DF' AS equality,
   c1 LIKE U&'\00DF' AS LIKE,
   c1 ILIKE U&'\00DF' AS ILIKE from src;
 c1 | equality | LIKE | ILIKE
----+----------+------+-------
 ß  | t        | t    | t
 ss | f        | f    | f
(2 rows)

将区域改为德文,强度为 1(忽略大小写和口音):

\locale LDE_S1
=> SELECT c1, c1 = 'ss' AS equality,
c1 LIKE 'ss' as LIKE, c1 ILIKE 'ss' AS ILIKE from src;
 c1 | equality | LIKE | ILIKE
----+----------+------+-------
 ß  | t        | t    | t
 ss | t        | t    | t
(2 rows)

该例说明使用模式匹配谓词二进制数据类型:

=> CREATE TABLE t (c BINARY(1));
=> INSERT INTO t values(HEX_TO_BINARY('0x00'));
=> INSERT INTO t values(HEX_TO_BINARY('0xFF'));
=> SELECT TO_HEX(c) from t;
 TO_HEX
--------
 00
 ff
(2 rows)
select * from t;
  c
------
 \000
 \377
(2 rows)
=> SELECT c, c = '\000', c LIKE '\000', c ILIKE '\000' from t;
  c   | ?column? | ?column? | ?column?
------+----------+----------+----------
 \000 | t        | t        | t
 \377 | f        | f        | f
(2 rows)
=> SELECT c, c = '\377', c LIKE '\377', c ILIKE '\377' from t;
  c   | ?column? | ?column? | ?column?
------+----------+----------+----------
 \000 | f        | f        | f
 \377 | t        | t        | t
(2 rows)