Select

Like 謂詞僅匹配整個單詞

  • December 15, 2017

我有一個 SQLite 數據庫,其中有一個名為minecraft.

+----+----------------------+
| id |         name         |
+----+----------------------+
|  1 | Pocket Mine MP       |
|  2 | Open Computers       |
|  3 | hubot minecraft skin |
|  4 | Terasology           |
|  5 | msm                  |
+----+----------------------+

我需要找到所有在其“名稱”欄位中具有“e”和“o”的記錄。這是我的選擇查詢:

select * from minecraft where name like '%e%o%'

以下是上述查詢的結果:

+----+----------------+
| id |      name      |
+----+----------------+
|  2 | Open Computers |
|  4 | Terasology     |
+----+----------------+

問題是 Like 謂詞匹配整個值,而不是單詞。id = 2 的行不應該匹配,因為所有條件都不是在一個單詞中出現(’e’ 出現在第一個單詞中,‘o’ 出現在另一個單詞中):Op e n C o mputers。


我應該如何更改我的 Select 查詢,使其與單個單詞中包含“e”和“o”的唯一行匹配?

+----+------------+
| id |    name    |
+----+------------+
|  4 | Terasology |
+----+------------+

謝謝

您最好的選擇可能是使用REGEXP,它需要一些特殊的安裝才能使用。

在這種情況下,您將使用:

WHERE         
   name REGEXP 'e\w*o' 

這個正則表達式的意思是:(文字’e’)後跟(零個或多個單詞字元)後跟(文字’o’)。

這種方法不會迴避像'This hello will work

參考資料


替代方案

如果您無法安裝所需的軟體包以使其REGEXP可用,您可能可以使用使用者定義的函式來執行“逐字”LIKE檢查。讓我們假設它被稱為check_words_like(sentence, like_predicate),我會以下列方式使用:

SELECT
   whatever
FROM
   (SELECT
       name, whatever
   FROM
       tbl
   WHERE
       name like '%e%o%'
   ) AS q1
WHERE
   check_words_like(q1.name, '%e%o%') ;

這仍然需要一些 C 程式和介面,並且可能與獲得正確的 REGEXP 包一樣複雜。

正如 Jkavalik 評論的那樣,無法索引LIKE開頭的查詢。%

LIKE 過濾器在樹遍歷期間只能使用第一個萬用字元之前的字元。剩下的字元只是過濾謂詞,不會縮小掃描的索引範圍。

以萬用字元開頭的 LIKE 表達式

$$ … $$不能用作訪問謂詞。如果沒有其他條件提供訪問謂詞,則數據庫必須掃描整個表。

好像它沒有索引一樣。

如果您的數據庫不是“大”,只需使用正則表達式。它將使您的開發更容易,即使選擇所有行可能需要一些時間。

如果您仍想避免它們,請考慮使用GLOB運算符。它不如正則表達式強大,但比LIKE. 我的建議。

SELECT id, name
   FROM minecraft
   WHERE name GLOB '*e*o*'
       AND name NOT GLOB '*e* *o*';

它沒有那麼強大,因為它不會匹配帶有“ h e ll o ”之類的單詞的行,而不是在第一個位置,例如“ This hello wont match ”。

引用自:https://dba.stackexchange.com/questions/123584