このようなものを試してください:
WITH AreaCode (A) AS (
SELECT '[0-9][0-9][0-9][-.]'
UNION ALL SELECT '([0-9][0-9][0-9])-'
), Prefix (P) AS (
SELECT '[0-9][0-9][0-9]-'
), Last4 (L) AS (
SELECT '[0-9][0-9][0-9][0-9]'
), Ext1 (E1) AS (
SELECT ' x'
UNION ALL SELECT ' Ext.'
UNION ALL SELECT ' ext'
), Ext2 (E2) AS (
UNION ALL SELECT '[0-9][0-9]'
UNION ALL SELECT '[0-9][0-9][0-9]'
UNION ALL SELECT '[0-9][0-9][0-9][0-9]'
), Extension (E) AS (
SELECT ''
UNION ALL SELECT E1 + E2 FROM Ext1 CROSS JOIN Ext2
),
SELECT *
FROM
YourTable Y
WHERE NOT EXISTS (
SELECT *
FROM
AreaCode
CROSS JOIN Prefix
CROSS JOIN Last4
CROSS JOIN Extension
WHERE
Y.PhoneNumber LIKE AreaCode + Prefix + Last4 + Extension
);
有効であるがクエリでカバーされていないパターンを見つけた場合は、それらを表示されているパーツおよびピースに追加します。2つの部分で一緒にする必要があるものが見つかった場合は、拡張CTE(欠落しているか、Ext1とExt2の組み合わせ)の後にモデル化します。国際番号をサポートする必要があり、それらが異なるパターン(US 3-3-4と一致しない)を持っている場合、適切な国コードを適切なパターンと一致させるために、いくつかの分析と適切な相関が必要になります。たとえば、ブラジルの特定の地域では、これは有効な番号であることを知っています:+55 85 1234-5678(国コード55、市外局番2桁、次に4-4パターン)。
データの分析に役立つ別のテクニックは次のとおりです。
WITH Patterns (P) AS (
SELECT
Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(
PhoneNumber,
'1', '0'), '2', '0'), '3', '0'), '4', '0'),
'5', '0'), '6', '0'), '7', '0'), '8', '0'), '9', '0'
)
)
SELECT P, Count(*)
FROM Patterns
GROUP BY P;
これは、各行間の実際の電話番号の違いを無視し、桁の配置とカウントのみに注意を払うことで、データがどのようなものかを理解するのに役立ちます。アルファベット文字が多い場合は、有効なパターン(「ext」など)をリストにない値に置き換えてみてください。そうすれば、残りの偽の入力を、類似したもので分析できるものに折りたたむことができます。Replace()
アルファベットの各文字。