2011-11-09 5 views
6

私のデータベースには、varchar型の電話番号のリストが含まれています。電話番号は、私は12323232323を検索した場合、代わりにシンボルの検索クエリを書くためのヘルプが必要

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

(),.またはspace があるかもしれないこれらのいずれかの形式であってもよく1-232-323 2323、232-323-2323 、または2323232323にこれらの結果がすべて表示されます。私はこれのためのクエリを書く必要があります。

+0

[MySQL文字列関数](http://dev.mysql.com/doc/refman/5.0/en/string-functions.html)を見ましたか? –

+0

本当に電話番号の書式を保存する必要がありますか?現在のユーザーのローカリゼーション設定に基づいて電話番号を表示するときに、電話番号を単一の形式で保存して再フォーマットすることを検討しましたか? –

+1

@Phoenix私はあなたが数字でフォーマットを保存したくないかもしれないことに同意しますが、ドイツ語フォーマットの米国の番号を言うユーザーのロケールに基づいてフォーマットするのは意味がないと思います。ローカリゼーションが懸念される場合は、おそらく国コードを保存し、そのコードに基づいて番号をフォーマットする必要があります。 –

答えて

10

これをリアルタイムで行うのは効率的ではないと私は考えています。

  1. フォーマットは1つだけです。

  2. は、あなたが検索したときに表示は、さまざまな形式のデータを表示することができますときに、あなたは、この列を検索し、クリーンなデータが含まれている別の列を追加します。

+0

これはまさにこれです。 +1 –

2

私はJamesに同意しますが、実際にデータベースを検索する必要がある場合は、MySQLのREPLACE演算子が必要な場所に移動します。

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

1文字置き換えには問題ありません。文字列の配列を置き換えることは可能ですか?私の場合は '()、。 ''の代わりに '' space 'を使用します。 – Juice

+0

私はこのような配列でしようとしましたが、どこに置き換えますか(c.customers_telephone、 '"。$ chars。"'、 '')= '"。 $だけ番号。 "、" '";'そして私はこのようなクエリを実行しています' where replace(c.customers_telephone、 'Array'、 '')= '2323232323'' – Juice

+2

このルートに行くと、インデックスを使うことはできませんあなたの質問をスピードアップする。すべてのクエリに対してMySQLに完全なテーブルスキャンを強制します。代わりにデータを消毒することを強くお勧めします。 –