Каков наилучший способ узнать, сколько записей не имеют правильный номер телефона в SQL Server?

11

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

Я искал в SSIS для этого. Я склоняюсь к использованию компонента сценария с выражением регулярного выражения в некотором коде C # с последующим перенаправлением. Тем не менее, мне было интересно, есть ли способ в SSIS сделать это, не прибегая к C #.

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

rsteckly
источник
У вас есть пример данных, пожалуйста?
ГБН
1
Можете ли вы просмотреть ответы здесь, пожалуйста?
ГБН
Как дела? Вы прошли это препятствие?
ErikE

Ответы:

7

Это одноразовое задание. Напишите небольшое приложение или просто выберите скрипт, используйте C #, VB.NET, T-SQL ... и анализируйте все шаблоны вручную. Возможно, вы найдете общие закономерности операторов, которые внесли эти данные. Добавить алгоритм для каждого шаблона. Примените ваши шаблоны к реальным данным в базе данных. Удалите все «неправильные» записи.

Удача.

ДОБАВЛЕНО:

Как вариант, вы можете использовать базу телефонных номеров, чтобы проверить достоверность person2number, если это возможно.

Гарик
источник
Лично я бы не удалял «неправильные» числа ... поскольку это может быть шаблон, который вы не рассматривали (например, кто-то с префиксом «+») ... запускайте его несколько раз в режиме отладки, где он сообщает, что он считает плохим значением, и просматривает его, прежде чем вносить какие-либо изменения.
Джо
@ Джо согласен: я использовал два столбца «новое» значение и «старый» для резервного копирования данных. Это было просто "сильное" слово :)
garik
4

SSIS = SQL Server Integration Service - в основном способ интеграции данных из многих источников во многие места назначения. Что-то вроде движка для извлечения данных из excel / csv / text ... какой другой файл приходит на ум ... и перемещения его в базу данных. Или наоборот.

Но для того, чтобы фактически выбирать и манипулировать данными, вы все равно сможете / будете обязаны использовать T-SQL.

Из того, что я знаю, в T-SQL нет никакого компонента регулярных выражений, который мог бы вам помочь, поэтому вам потребуется использовать сборку .NET для этого.

Мэриан
источник
1

Вы можете получить быструю оценку с помощью следующего предложения WHERE, поскольку номера телефонов не должны иметь буквенных символов ... если только вы не разрешите фонетические номера, напр. 1-800-ANT-ФАРМ.

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% числовыми, используя NOT в шаблоне поиска.

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()за каждую букву в алфавите.

ErikE
источник