跳轉到內容

結構化查詢語言/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 實現通常將它們與特殊的文字索引結合使用。


華夏公益教科書