Like 謂詞僅匹配整個單詞
我有一個 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 ”。