SQL Server에 적절한 전화 번호가없는 레코드 수를 확인하는 가장 좋은 방법은 무엇입니까?


11

역사적으로 사람들이 자유롭게 가치를 제공하는 데 사용할 수있는 분야가 있습니다. 적절한 값이없는 레코드를 식별하여 정리할 수 있어야합니다.

나는 이것을 위해 SSIS를 둘러 보았습니다. 내 성향은 일부 C # 코드에서 정규 표현식으로 스크립트 구성 요소를 사용하고 리디렉션하는 것입니다. 여전히 SSIS에 C #을 사용하지 않고이 작업을 수행 할 수있는 방법이 있는지 궁금합니다.

적절한 전화 번호가없는 레코드 수를 확인하는 방법을 찾는 것은 운이 없었습니다.


샘플 데이터가 있습니까?
gbn

1
여기서 답변을 검토해 주시겠습니까?
gbn

상황은 어땠습니까? 이 장애물을 통과 했습니까?
ErikE

답변:


7

한 번의 작업입니다. 작은 응용 프로그램을 작성하거나 스크립트를 선택하고 C #, VB.NET, T-SQL을 사용하고 모든 패턴을 수동으로 분석하십시오. 이 데이터를 입력 한 운영자가 공통 패턴을 찾을 수도 있습니다. 모든 패턴에 알고리즘을 추가하십시오. 데이터베이스의 실제 데이터에 패턴을 적용하십시오. "잘못된"레코드를 모두 제거하십시오.

운.

추가 :

옵션으로 전화 번호 데이터베이스를 사용하여 가능한 경우 person2number 유효성을 확인할 수 있습니다.


나는 개인적으로 '잘못 된'숫자를 제거하지 않을 것입니다 ... 당신이 고려하지 않은 패턴 일 수 있기 때문에 (예 : '+'로 접두사를 쓰는 누군가) ... 디버깅 모드에서 몇 번 실행하십시오. 잘못된 값으로 간주되는 것을보고하고 수정하기 전에 살펴 봅니다.
Joe

@Joe 동의 : 데이터를 백업하기 위해 두 개의 "새"값과 "오래된"열을 사용했습니다. 그것은 단지 "강한"단어
였습니다

4

SSIS = SQL Server 통합 서비스-대부분 여러 원본에서 여러 대상으로 데이터를 통합하는 방법입니다. excel / csv / text에서 데이터를 가져 오는 엔진과 같은 것. 다른 파일이 생각 나는 것 .. 데이터베이스로 옮깁니다. 아니면 다른 방법.

그러나 실제로 데이터를 선택하고 조작하려면 여전히 T-SQL을 사용해야합니다.

내가 아는 바에 따르면 T-SQL에는 도움이되는 정규식 구성 요소가 없으므로 .NET 어셈블리를 사용해야합니다.


1

전화 번호에 영문자가 없어야하기 때문에 다음 WHERE 절을 통해 빠른 추정치를 얻을 수 있습니다. 1-800-ANT-FARM.

WHERE phonenumber LIKE '%[a-zA-Z]%'

LIKE를 사용하여 복잡한 정규 표현식 수행 할 수는 없지만 가까운 근사값을 얻을 수 있습니다.

내 테스트 :

WITH cte AS (
    SELECT id, phone
    FROM (
        VALUES
            (1, '1234567890'),
            (2, '4567890'),
            (3, '(123) 456-7890'),
            (4, '123-456-7890'),
            (5, '123.456.7890'),
            (6, 'Testing')
    )
    AS MyTable(id, phone)
)
SELECT *
FROM cte
WHERE phone LIKE '%[a-zA-Z]%'

1

그것은 전화 번호에서 허용되거나 허용되지 않는 것에 달려 있습니다.

검색 패턴에 NOT을 사용하여 100 % 숫자가 아닌 모든 값을 제공합니다.

WHERE phonenumber LIKE '%[^0-9]%'

그러나 허용 -하거나 허용하면 (000)더 복잡합니다. 샘플 데이터가 필요합니다.


0

다음과 같이 해보십시오 :

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()알파벳의 각 글자마다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.