0

文字列内の数値以外の文字を置き換えるより良い方法が必要です。

私はそのような電話番号を持っています (888) 488-6655 888-555-8888 何とか何とか

したがって、単純な置換関数を使用してきれいな文字列を返すことができますが、式関数を使用して数値以外の値を置き換えるより良い方法を探しています。スペース スラッシュ、バックスラッシュ、引用符など 任意の数値以外

これは私の現在のクエリです

SELECT
a.account_id,
REPLACE(REPLACE(REPLACE(REPLACE(t.phone_number, '-', ''), ' ', ''), ')', ''),'(','') AS contact_number,
IFNULL(t.ext, '') AS extention,
CASE WHEN EXISTS (SELECT number_id FROM contact_numbers WHERE main_number = 1 AND account_id = a.account_id) THEN 0 ELSE 1 END AS main_number,
'2' AS created_by
FROM cvsnumbers t
INNER JOIN accounts a ON a.company_code = t.company_code
WHERE REPLACE(REPLACE(REPLACE(REPLACE(t.phone_number, '-', ''), ' ', ''), ')', ''),'(','')  NOT IN(SELECT contact_number FROM contact_numbers WHERE account_id = a.account_id)
AND LENGTH(REPLACE(REPLACE(REPLACE(REPLACE(t.phone_number, '-', ''), ' ', ''), ')', ''),'(','') ) = 10

REGEX を使用して数値以外の値を置き換えるようにクエリを変更するにはどうすればよいですか。

ありがとう

4

2 に答える 2

1

これは強引なアプローチです。

アイデアは、電話番号の各桁にインデックスを付ける数値テーブルを作成することです。数字の場合はその数字を保持し、それらをグループ化します。それがどのように機能するかは次のとおりです。

select t.phone_number,
       group_concat(SUBSTRING(t.phone_number, n.n, 1) separator '' order by n
                   ) as NumbersOnly
from cvsnumbers t cross join
     (select 1 as n union all select 2 union all select 3
     ) n
where SUBSTRING(t.phone_number, n.n, 1) between '0' and '9'
group by t.phone_number;

この例では、数値の最初の 3 桁のみを調べます。サブクエリをn電話番号の最大長まで拡張します。

于 2013-05-15T19:10:45.707 に答える
0

mySql 正規表現のフレーバーはわかりませんが、これを試してみます。

REPLACE(t.phone_number, '[^\d]+', '')

[^\d]+意味: 「数字以外のすべてに 1 回以上一致する」

バックスラッシュ ( ) をエスケープする必要がある場合があります[^\\d]+

于 2013-05-15T18:35:30.703 に答える