다음과 같이 해보십시오 :
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
);
유효하지만 쿼리에서 다루지 않는 패턴을 찾으면 표시된 부품 및 조각에 추가하십시오. 두 부분에서 함께 필요한 것이 있으면 Extension CTE (Ext1과 Ext2의 조합이 없거나 누락 된)를 따라 모델링하십시오. 국제 번호를 지원해야하고 다른 패턴 (미국 3-3-4와 일치하지 않음)이있는 경우 올바른 국가 코드가 올바른 패턴과 일치하도록 분석하고 적절한 상관 관계가 필요합니다. 예를 들어 브라질의 특정 지역에서는이 번호가 +55 85 1234-5678 (국가 코드 55, 지역 코드 두 자리, 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()
알파벳의 각 글자마다.