SQL, имеющий дело с мусором в поле номера телефона

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

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

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

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

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

07800 000647 (мобильных телефонов)
07500 000189 ИСПОЛЬЗУЮТ 1-Й
СМ. ПРИМЕЧАНИЯ
07900 000415 HO ТОЛЬКО
попробуйте 1-й 0770 0000694 затем домой
07500 000465 не Может

Требования

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

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

Например:

Это:

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

Должен стать этим:

07700000694

Что-либо без номера телефона в нем (например, "ВИДЯТ ПРИМЕЧАНИЯ") должно быть пустым.

ОБНОВЛЕНИЕ:

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

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

5
задан Reinstate Monica 14 August 2013 в 12:36
поделиться

6 ответов

Предполагая, что телефоны 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 символов числа. Наконец, заменяем пробелы ...

2
ответ дан 15 December 2019 в 06:21
поделиться

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

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 December 2019 в 06:21
поделиться

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

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 December 2019 в 06:21
поделиться

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

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

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

0
ответ дан 15 December 2019 в 06:21
поделиться

DECLARE @test varchar (100)
DECLARE @result varchar (100)
SET @ test = '07800 000647 (mobile)'

SET @result = ''
SELECT
@ result = @ result + CASE WHEN number LIKE '[0-9]' THEN number ELSE '' END FROM
{{1 }} (
ВЫБРАТЬ ПОДСТРОКУ (@ test, number, 1) AS number FROM
(
SELECT NUMBER FROM Master..spt_values ​​WHERE type = 'p' И число от 1 до len (@test)
) AS temp
) AS temp
SELECT @result

Однако, как говорит MusicGenesis, вы должны иметь дело с чем-то вроде 1-го и 2-го отдельно.

0
ответ дан 15 December 2019 в 06:21
поделиться

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

1
ответ дан 15 December 2019 в 06:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: