2011-11-09 35 views
6

我的數據庫包含一個varchar類型的電話號碼列表。電話號碼可以是任何一種格式需要幫助來編寫搜索查詢

12323232323 
1-232-323 2323 
232-323-2323 
2323232323 

取而代之的是符號有可能是(),.space 如果我搜索12323232323,1-232-323 2323,232-323-2323 ,或者2323232323它應該顯示所有這些結果。我需要爲此寫一個查詢。

+0

你看過[MySQL字符串函數](http://dev.mysql.com/doc/refman/5.0/en/string-functions.html)嗎? –

+0

你真的需要保存電話號碼的格式嗎?您是否考慮將電話號碼存儲爲單一格式,並根據當前用戶的本地化設置顯示這些電話號碼時重新格式化它們? – 2011-11-09 13:49:16

+1

@Phoenix我同意你可能不想用數字來存儲格式,但我認爲根據用戶的語言環境來格式化,例如用德文格式表示美國數字是不合理的。如果本地化是一個問題,您可能需要存儲國家代碼,然後根據該代碼格式化數字。 –

回答

10

我認爲這樣做實時效率不高,我提出了兩個選擇。

  1. 清理數據,所以只會有一種格式。

  2. 添加另一列包含乾淨的數據,所以當您搜索時,您搜索此列,當顯示時您可以顯示各種格式的數據。

+0

正是這樣。 +1 –

2

我同意詹姆斯,但如果你真的需要在數據庫中搜索,因爲它是,也許是MySQL的更換運營商將會把你帶到任何你需要去。喜歡的東西

select * from mytable where replace(crazynumber,'-','')='23232323'; 
+0

它適用於單個字符替換。是否有可能取代一個字符串數組?在我的情況下可能有'(),。或空間'而不是'-'。 – Juice

+0

我試着用這樣的數組''替換(c.customers_telephone,''。$ chars。'','')='「。 $ onlynumbers。 「'」;'和我得到的查詢運行像這樣'where replace(c.customers_telephone,'Array','')='2323232323'' – Juice

+2

請注意,如果你走這條路線,你不能使用索引加快查詢速度;您將強制MySQL爲每個查詢執行全表掃描。我強烈建議您改爲清理數據。 – 2011-11-09 13:47:53