2014-03-26 92 views
0

在MySQL中,我試圖找到具有匹配模式的值的行。在我的數據中,我使用的模式是401.%,402.%,403.%,404.%和405.%。換句話說,我試圖找到401和405之間的任何浮點數。另外,這些數字存儲爲varchar。它是一個字符串。到目前爲止,我已經嘗試了以下代碼,但徒勞無功:MySQL:用數字模式找到匹配

select * from my_table where my_column like '401.%' 

等等。

你能想出一種方法使這項工作?感謝您的幫助提前。

+0

那麼我們應該如何'LIKE'運營商對待'[1-5]'?它搜索這個確切的字符串,因爲你沒有一個 - 它沒有返回任何東西。 – zerkms

+1

你在那裏只能使用'my_column REGEXP'^ 40 [1-5] \'' –

+0

我不清楚發佈我的示例代碼(編輯過)的意圖。我正在尋找像正則表達式這樣的東西。我想避免重複五次這樣的聲明。 – midtownguru

回答

2

MySQL將數字轉換爲字符串非常好。所以,你可以嘗試這樣的事情:

where my_column + 0 >= 401 and my_column < 406 

當然,這並不處理在前三個字符後出現壞字符的情況。但它可能足以達到你的目的。

編輯:

如果你確實想使用索引爲此,然後執行:

where my_column >= '401' and my_column < '406' and 
     my_column + 0 >= 401 and my_column < 406 

前兩個字符串比較應該採取指數的優勢。

+0

儘管我討厭與你的名聲不同的人,但你有沒有想過這意味着什麼?將所有記錄投射到數字上 - 即使是那些不匹配和沒收所有索引使用的記錄? –

+0

@EugenRieck。 。 。可能是一個很好的觀點,但我不確定MySQL會使用索引來處理由'或'連接的'like'比較字符串。 –

+0

如果'LIKE'不以通配符開頭,則會使用索引(如果存在)。在這種情況下,OR將會一個接一個執行。 –

2
select * from my_table where my_column like '401.%' or my_column like '402.%' or my_column like '403.%' or my_column like '404.%' or my_column like '405.%' 

應該會藉此最好迄今爲止...排序循環展開的SQL

+0

你真的知道這個查詢是否會使用索引嗎? –

+0

剛剛在我的本地主機(Ubuntu 12.04,MySQL 5.5.35-0ubuntu0.12.04.2)上試過一個快速和骯髒的問題,並且執行計劃顯示「可能的密鑰」而不是「密鑰」......但只有1000行,全部在緩存中。 –

+0

@GordonLinoff是的,它會使用索引;剛測試過> = 300k記錄在5.5) –