このように、任意にフォーマットされた電話番号でいっぱいのテーブルがあります
027 123 5644
021 393-5593
(07) 123 456
042123456
同様に任意の形式で電話番号を検索する必要があります(たとえば07123456
、エントリを見つける必要があります(07) 123 456
通常のプログラミング言語でこれを行う方法は、数字以外のすべての文字を「針」から取り除き、干し草の山にある各数字を調べ、数字以外のすべての文字を取り除き、それと比較することです。針、例えば (ルビー)
digits_only = lambda{ |n| n.gsub /[^\d]/, '' }
needle = digits_only[input_phone_number]
haystack.map(&digits_only).include?(needle)
問題は、MySQL でこれを行う必要があることです。多くの文字列関数がありますが、どれも私が望むことを実際に行っているようには見えません。
現在、私は2つの「解決策」を考えることができます
- と の franken-query を一緒にハック
CONCAT
するSUBSTR
- 針のすべての文字の間にa を挿入し
%
ます (つまり、次のようになります%0%7%1%2%3%4%5%6%
:)
ただし、どちらも特に洗練されたソリューションとは思えません。
うまくいけば、誰かが助けてくれるか、%%%%%% ソリューションの使用を余儀なくされるかもしれません
更新: これは、おそらく数百行の比較的固定されたデータ セットに対して動作しています。将来のプログラマーが泣くようなとんでもない悪いことをしたくなかっただけです。
データセットが大きくなった場合は、「phoneStripped」アプローチを採用します。すべてのフィードバックに感謝します!
「置換」機能を使用して、「(」、「-」、および「 」のインスタンスを削除できますか?
結果が数値であることは気にしません。私が考慮する必要がある主な文字は+
、-
、(
、です。では)
、space
その解決策は次のようになりますか?
SELECT * FROM people
WHERE
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(phonenumber, '('),')'),'-'),' '),'+')
LIKE '123456'
それはひどく遅くなりませんか?