SQL имеет дело с мусором в поле номера телефона - PullRequest
5 голосов
/ 15 апреля 2010

Сегодня у меня есть удивительно забавная маленькая проблема SQL, и я решил попросить сообщество посмотреть, какие решения вы предлагаете.

У нас есть действительно классная электронная почта для текстового сервиса, которую мы используем, вам просто нужно отправить электронное письмо по адресу phonenumber@servicename.com, и он отправит текстовое сообщение на нужный номер телефона.

Например, чтобы отправить текст на номер 0790 0006006, вам нужно отправить электронное письмо по адресу 07900006006@servicename.com, довольно аккуратно, да?

Проблема с телефонными номерами в нашей базе данных. Большинство телефонных номеров в порядке, но в некоторых из них есть "мусор", смешанный с номером телефона.

Возьмите эти замечательные примеры мусора, с которым вам нужно иметь дело (я анонимизировал номера телефонов, поместив нули в них):

07800 000647 (мобильный)
07500 000189 ИСПОЛЬЗОВАНИЕ 1ST
СМ. ПРИМЕЧАНИЯ
07900 000415 ТОЛЬКО ХО
попробуй 1й 0770 0000694 потом домой
07500 000465 Не могу

Требования

Решение должно быть в SQL (для сервера MS SQL).

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

Например:

Это:

Попробуйте 1-й 0770 0000694, затем домой

Должно стать так:

07700000694

Все, что не имеет номера телефона (например, «СМ. НОТЫ»), должно быть нулевым.

UPDATE:

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

Я оставлю вопрос в зрелости еще немного и посмотрю, поступят ли какие-нибудь голоса, прежде чем я присуду ответ.

Ответы [ 6 ]

2 голосов
/ 15 апреля 2010

Предполагая, что телефоны yopur всегда начинаются с '07' и длиной 12 символов, вы можете попробовать что-то вроде этого:

DECLARE @Number varchar(50)

--SET @Number='07800 000647(mobile)'
--SET @Number='07500 000189 USE 1ST'
--SET @Number='SEE NOTES'
--SET @Number='07900 000415 HO ONLY'
--SET @Number='try 1st 0770 0000694 then home'
SET @Number='07500 000465 Cannot '



SELECT REPLACE(SUBSTRING(@Number, case when CHARINDEX ('07',@Number ) =0 then Null 
else CHARINDEX ('07',@Number )end , 12),' ','')

Прежде всего, найдя начальную точку строки '07', затем, если она равна 0 ('СМ. НОТЫ'), верните Null. После этого получаем 12 символов номера. Наконец, замена пробелов ...

1 голос
/ 15 апреля 2010

Лучше всего исправить данные. Если вы не можете исправить данные, вставьте новое вычисляемое поле, которое удаляет ненужные вам символы. В любом случае, начните сейчас, чтобы поместить элементы управления вводом данных в это поле в вашем приложении. Вы, честно говоря, не хотите тратить впустую вычислительную мощность, занимаясь подобным манипулированием данными с каждым запросом, когда он вводит данные и завершает их.

0 голосов
/ 15 апреля 2010

Решение, которое я до сих пор нашел, заключается в следующем:

SELECT 
CASE WHEN ISNUMERIC(SUBSTRING(REPLACE(MobilePhone, ' ', ''), 1, 11)) = 1 
THEN SUBSTRING(REPLACE(MobilePhone, ' ', ''), 1, 11) + '@emailservice.com' 
ELSE NULL END AS EmailToTextAddress
FROM Contacts

Однако это не относится к мусору в начале номера телефона.

Также предполагается, что номер телефона (без пробелов) имеет длину 11 символов, что позволяет мне иметь дело с числовыми символами, которые не являются частью номера телефона (как в ответе MusiGenesis).

0 голосов
/ 15 апреля 2010

Похоже, вы могли бы шагать в поисках длинных непрерывных цепочек чисел: (быстрая и грязная)

CREATE FUNCTION fnRipMsisdn(@STRING VARCHAR(28)) RETURNS VARCHAR(28) AS
BEGIN
DECLARE @I INT, @RESULT VARCHAR(28), @CHAR CHAR, @CONCURRENT_ALPHA INT
SET @I = 0
SET @RESULT = ''
SET @CONCURRENT_ALPHA = 0
SET @STRING = REPLACE(@STRING, ' ', '') --replace chars that can delimit an msisdn

WHILE @I < LEN(@STRING) BEGIN
    IF LEN(@RESULT) >= 13 --MAX LEN
        BREAK
    SET @I = @I + 1
    SET @CHAR = SUBSTRING(@STRING, @I, 1)
    IF @CHAR LIKE '[0-9]' AND @CONCURRENT_ALPHA < 1 BEGIN
        SET @CONCURRENT_ALPHA = 0
        SET @RESULT = @RESULT + @CHAR
    END ELSE BEGIN
        SET @CONCURRENT_ALPHA = @CONCURRENT_ALPHA + 1
        IF LEN(@RESULT) <= 9 BEGIN --MIN LEN
            SET @RESULT = ''
        END
    END
END
RETURN CASE WHEN @RESULT = '' THEN NULL ELSE @RESULT END
END

select dbo.fnRipMsisdn('07800 000647(mobile)')
select dbo.fnRipMsisdn('07500 000189 USE 1ST')
select dbo.fnRipMsisdn('SEE NOTES')
select dbo.fnRipMsisdn('07900 000415 HO ONLY')
select dbo.fnRipMsisdn('try 1st 0770 0000694 then home')
select dbo.fnRipMsisdn('07500 000465 Cannot')

07800000647
07500000189
NULL
07900000415
07700000694
07500000465
0 голосов
/ 15 апреля 2010

ОБЪЯВИТЬ @test varchar (100)
ЗАЯВИТЬ @result varchar (100)
SET @ test = '07800 000647 (мобильный)'

SET @result = ''
SELECT
@ result = @ result + CASE, КОГДА число НРАВИТСЯ '[0-9]' THEN число ELSE '' КОНЕЦ
(
ВЫБЕРИТЕ ПОДПИСЬ (@ test, number, 1) AS number From
(* 1 010 * ВЫБЕРИТЕ НОМЕР ИЗ Master..spt_values ​​ГДЕ type = 'p' И число от 1 до len (@test)
) AS temp
) AS temp
ВЫБЕРИТЕ @result

Как говорит MusicGenesis, вам придется иметь дело с чем-то вроде 1-го и 2-го по отдельности.

0 голосов
/ 15 апреля 2010

Исходя из ваших примеров, похоже, что по большей части вам просто нужно удалить все нечисловые символы и пробелы из строки (я не помню функцию SQL для этого, но она тривиальна). Единственное исключение относится к таким вещам, как «1-й» или «2-й», и вы можете избавиться от них, прежде чем вычеркнуть нечисловые символы с помощью набора операторов REPLACE('1ST','') -типа.

В ваших данных могут быть гораздо более странные ситуации, когда люди включают фактические цифры, которые на самом деле не являются частью их номера телефона. Я не уверен, как вы находите и исправляете все это, кроме как просто иметь дело с ними всякий раз, когда вы обнаруживаете их.

Несомненно, существует множество сторонних компонентов, которые обрабатывают разбор номера телефона, но я не знаю, можно ли использовать их непосредственно из SQL Server. Возможно, некоторые из них могут, в зависимости от вашей версии SQL Server. Поиск в Google по запросу "анализ телефонных номеров в SQL Server" дает множество вариантов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...