跳转到内容

结构化查询语言/Like 谓词

来自维基教科书,开放世界中的开放书籍

从一开始,SQL 就包含了字符串模式匹配的基本形式。该功能是 WHERE 子句的一部分,由关键字 LIKE 触发。它知道两个元字符:'_'(下划线)和 '%'(百分号)。

SELECT * 
FROM   <table_name>
WHERE  <column_name> LIKE <like_criterion>; -- The like_criterion can contain '_' and/or '%'

随着时间的推移,标准中加入了额外的功能。这涉及正则表达式,它们类似于由POSIX定义的正则表达式,以及由 XQuery 1.0 / XPath 2.0 函数fn:matches()定义的正则表达式。最后,SQL 应用程序包ISO/IEC 13249-2:2003 第 2 部分:全文定义了全文检索方法和函数。

LIKE 谓词将类型为 CHAR 或 VARCHAR(字符串)的列与模式进行比较。此模式也是字符串,但它可能包含两个具有特殊含义的字符。'_'(下划线)代表一个任意字符,'%'(百分号)代表一个零个、一个或多个字符的字符串。所有其他字符都代表自身。

第一个示例从 person 表中检索所有以两个字符 'Jo' 开头的名字的行,例如:'John'、'Johanna' 或 'Jonny W.'。由于元字符 '%' 也代表零个字符,所以也会检索名字为 'Jo' 的行。

SELECT * 
FROM   person
WHERE  firstname LIKE 'Jo%';

下一个示例从 person 表中检索所有姓氏类似于 'Meier' 的行,例如:'Meyer' 或 'Maier'。两个下划线代表两个(任意)字符。请注意,可能会有意想不到的结果,例如 'Miler'(但不是 'Miller')。

SELECT * 
FROM   person
WHERE  lastname LIKE 'M__er';

两个元字符 '_' 和 '%' 的定义意味着一个问题:如果要搜索这些字符本身呢?解决方案与其他编程语言中的解决方案相同:定义一个转义机制来掩盖元字符,并在模式中用此转义字符作为元字符的前缀。在 SQL 中,语法为

...
WHERE <column_name> LIKE <like_criterion> ESCAPE <escape_character>;


-- Retrieve one of the meta-characters: 'Electric_Motor' but not 'Electric Motor'
SELECT * 
FROM   parts
WHERE  partname LIKE 'Electric\_Motor' ESCAPE '\';


-- Retrieve the escape character itself: 'Electric\Motor' but not 'Electric Motor'
SELECT * 
FROM   parts
WHERE  partname LIKE 'Electric\\Motor' ESCAPE '\';

转义字符可以是任何字符;它不限于反斜杠,例如:... ESCAPE '!'

POSIX 语义

[编辑 | 编辑源代码]

在 SQL 标准的旧版本中,存在关键字 SIMILAR,它引入了POSIX意义上的模式匹配。现在,它已过时。

某些实现提供此意义上的模式匹配,但使用任意关键字,例如 REGEXP、REGEXP_MATCHES、REGEXP_LIKE 或运算符,例如 '~' 来激活此功能。

XQuery 语义

[编辑 | 编辑源代码]

SQL 标准定义了关键字 LIKE_REGEX 来激活由 XQuery 1.0 / XPath 2.0 函数fn:matches()定义的模式匹配。

全文检索

[编辑 | 编辑源代码]

SQL 标准由ISO/IEC 13249 SQL 多媒体和应用程序包补充。第 2 部分全文检索定义了文本文档信息检索的例程和方法。它处理诸如:单词、短语、句子和段落之类的对象。存在特殊结构;用于搜索单词或短语、在可定义距离内搜索单词、词库功能(例如单词的更广泛的术语)、Soundex 相似度、结果排名等等。这些功能的中心方法是 CONTAINS。

-- Retrieve rows with 'word_1' and 'word_2' (in this order) within a sequence of 10 words.
SELECT * 
FROM   t1
WHERE  CONTAINS(' "word_1" NEAR "word_2" WITHIN 10 WORDS IN ORDER ') = 1;

此类功能远远超出了模式匹配 - 但它是自然而然的下一步。SQL 实现通常将它们与特殊的文本索引结合使用。


华夏公益教科书