0

2 つのデータベースがあり、どちらにも電話番号が含まれています。重複する電話番号のすべてのインスタンスを見つける必要がありますが、データベース 1 の形式はデータベース 2 の形式と大きく異なります。

数字以外の文字をすべて取り除き、2 つの 10 桁の文字列を比較して、重複しているかどうかを判断したいと思います。たとえば、次のようになります。

SELECT b.phone as barPhone, sp.phone as SPPhone FROM bars b JOIN single_platform_bars sp ON sp.phone.REGEX = b.phone.REGEX

mysqlクエリでもそのようなことは可能ですか? もしそうなら、どうすればこれを達成できますか?

編集:実際、それはあなたができることのようです!万歳!次のクエリは、必要なものを正確に返しました。

SELECT b.phone, b.id, sp.phone, sp.id
FROM bars b JOIN single_platform_bars sp ON REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(b.phone,' ',''),'-',''),'(',''),')',''),'.','') = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(sp.phone,' ',''),'-',''),'(',''),')',''),'.','')
4

2 に答える 2

1

MySQLは、正規表現の「一致」を返すことをサポートしていません。MySQL REGEXP関数は、式が正規表現テストに一致したかどうかに応じて、1または0を返します。

REPLACE関数を使用して特定の文字を置き換え、それらをネストすることができます。ただし、すべての「数字以外の」文字では扱いにくいでしょう。スペース、ダッシュ、開き括弧、閉じ括弧などを削除する場合

REPLACE(REPLACE(REPLACE(REPLACE(sp.phone,' ',''),'-',''),'(',''),')','')

1つのアプローチは、文字列から数字だけを返すユーザー定義関数を作成することです。しかし、ユーザー定義関数を作成したくない場合は...


これは、ネイティブMySQLで実行できます。このアプローチは少し扱いに​​くいですが、「適度な」長さの文字列に対しては機能します。

SELECT CONCAT(IF(SUBSTR(sp.phone,1,1) REGEXP '^[0-9]$',SUBSTR(sp.phone,1,1),'')
             ,IF(SUBSTR(sp.phone,2,1) REGEXP '^[0-9]$',SUBSTR(sp.phone,2,1),'')
             ,IF(SUBSTR(sp.phone,3,1) REGEXP '^[0-9]$',SUBSTR(sp.phone,3,1),'')
             ,IF(SUBSTR(sp.phone,4,1) REGEXP '^[0-9]$',SUBSTR(sp.phone,4,1),'')
             ,IF(SUBSTR(sp.phone,5,1) REGEXP '^[0-9]$',SUBSTR(sp.phone,5,1),'')
       ) AS phone_digits
  FROM sp

それを少し解凍するには...文字列の最初の位置から1文字を抽出し、それが数字かどうかを確認します。数字の場合は文字を返し、そうでない場合は空の文字列を返します。文字列の2番目、3番目などの文字に対してこれを繰り返します。返されたすべての文字と空の文字列を連結して1つの文字列に戻します。

明らかに、上記の式は文字列の最初の5文字のみをチェックしているので、これを拡張する必要があります。基本的に、チェックする位置ごとに1行追加します...

また、このような扱いにくい式は、述語(WHERE句)に含めることができます。(便宜上、SELECTリストに表示しました。)

于 2012-08-30T19:07:43.197 に答える
1

MySQL は、そのような文字列操作をネイティブにサポートしていません。このような UDF を使用するか、検出された桁ごとに戻り値に連結する文字列パラメーターを反復処理するストアド関数を作成する必要があります。

于 2012-08-30T18:09:49.390 に答える