Який найкращий спосіб з’ясувати, скільки записів не мають належного номера телефону в SQL Server?


11

У мене є поле, яке люди історично могли використовувати для вільного надання цінності. Мені потрібно визначити записи, які не мають відповідного значення, щоб я міг їх очистити.

Я для цього оглядався в SSIS. Моя схильність полягає у використанні компонента скрипту з виразом регулярного вираження в деякому коді C # з подальшим перенаправленням. Тим не менш, мені було цікаво, чи є спосіб у SSIS зробити це, не вдаючись до C #.

Мені не дуже пощастило знайти спосіб дізнатися, скільки записів не мають відповідних номерів телефонів.


Чи є у вас зразки даних, будь ласка?
gbn

1
Чи можете ви, будь ласка, переглянути відповіді тут?
gbn

Як справи йшли? Ви пройшли цю перешкоду?
ЕрікЕ

Відповіді:


7

Це разове завдання. Напишіть невелику програму або просто виберіть скрипт, використовуйте C #, VB.NET, T-SQL ... та аналізуйте всі шаблони вручну. Можливо, ви дізнаєтесь загальні зразки операторів, які ввели ці дані. Додайте алгоритм для кожного шаблону. Застосовуйте свої шаблони до реальних даних у базі даних. Видаліть усі "неправильні" записи.

Удача.

ДОДАТО:

Як варіант, ви можете використовувати базу даних телефонних номерів, щоб перевірити дійсність людини2 кількість, якщо це можливо.


Я особисто не видаляв би "неправильні" номери ... так як це може бути шаблон, який ви не врахували (наприклад, хтось приєднав його до "+") ... запустіть його кілька разів у режимі налагодження, де він повідомляє про те, що вважає поганим значенням, і перегляньте його, перш ніж ви зможете внести будь-які зміни.
Джо

@Joe згоден: для резервного копіювання даних я використовував два стовпці "нове" значення та "старий". Це було просто "сильне" слово :)
garik

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

Це залежить від того, що прийнятно чи ні в номері телефону

Це дає вам усі значення, які не є на 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
);

Якщо ви знайдете шаблони, які є дійсними, але не охоплені запитом, додайте їх до показаних частин та фрагментів. Якщо ви знайдете щось, що має бути разом у двох частинах, моделюйте його після розширення 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()для кожної літери в алфавіті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.