我需要在數據庫中搜索一些用戶輸入模式。
在Mysql SELECT
語句的where子句中使用正則表達式(索引列上的10000行的比例)是否有效?
我搜索的日期,並且可以在這三種形式:正則表達式在Mysql select語句中
2012
應該匹配2012
,2012/*
&2012/*/*
2012/10
應該匹配2012/10
&2012/10/*
2012/10/3
只應2012/10/3
匹配
注意:我有三列應該單獨檢查這種類型的匹配。
我需要在數據庫中搜索一些用戶輸入模式。
在Mysql SELECT
語句的where子句中使用正則表達式(索引列上的10000行的比例)是否有效?
我搜索的日期,並且可以在這三種形式:正則表達式在Mysql select語句中
2012
應該匹配2012
,2012/*
& 2012/*/*
2012/10
應該匹配2012/10
& 2012/10/*
2012/10/3
只應2012/10/3
注意:我有三列應該單獨檢查這種類型的匹配。
雖然我不能找到MySQL文檔在一定的參考,由於索引結構,正則表達式匹配不能使用索引查找。
他們可能使用正則表達式來掃描索引而不是掃描整個表格,但是任何正則表達式搜索都會或多或少地與全表掃描等效。
如果您的正則表達式以一個常量字符串開頭,那麼您可能希望將查詢構造爲;
SELECT * FROM TableA WHERE field LIKE 'tr%' AND field RLIKE 'tr[uae].*'
獲得來自像一些指標幫助, - 如果從字符串的開頭匹配 - 可以使用索引它的優勢。
編輯:由於您的選擇相當簡單,並匹配從字符串的開始,您可以使用LIKE使它們工作,其中將利用索引以及;
SELECT * FROM TableA WHERE field1='2012' OR field1 LIKE '2012/%'
SELECT * FROM TableA WHERE field1='2012/10' OR field1 LIKE '2012/10/%'
SELECT * FROM TableA WHERE field1='2012/10/3'
到比較分裂成兩個的原因是爲了避免2012/1
搜索將只用LIKE覆蓋這兩種情況下匹配2012/10
(即LIKE '2012/1%'
)。
發生這種情況是因爲LIKE不應該接受正則表達式作爲參數。有REGEXP這樣的事情
WHERE field NOT REGEXP '%_[0-9]+'
您的字段是否總是有效的日期或是否需要驗證?也就是說,一列可能包含「2012年陰影」並需要拒絕它? –
@JoachimIsaksson:是的,他們總是有效的 – RYN