2010-04-15 8 views
5

Ho un piccolo problema SQL molto divertente da risolvere oggi e ho pensato di chiedere alla comunità di vedere quali soluzioni si presentano.SQL che si occupa di rifiuti in un campo numero di telefono

Abbiamo un servizio di posta elettronica molto interessante che utilizziamo, è sufficiente inviare un'e-mail a [email protected] e invierà un messaggio di testo al numero di telefono desiderato.

Ad esempio per inviare un testo a 0790 0006006, è necessario inviare un messaggio di posta elettronica a [email protected], abbastanza pulito eh?

Il problema è con i numeri di telefono nel nostro database. La maggior parte dei numeri di telefono va bene, ma alcuni hanno "spazzatura" mescolata con il numero di telefono.

Prendete questi splendidi esempi di spazzatura è necessario affrontare con (ho resi anonimi i numeri di telefono ponendo zeri in):

07800 000647 (mobile)
07500 000189 USO 1 °
VEDERE NOTE
07900 000415 HO SOLO
provare prima 0770 0.000.694 poi a casa
07500 000.465 Impossibile

Requisiti

La soluzione deve essere in SQL (per MS SQL server).

Quindi la sfida è la seguente: dobbiamo ottenere il numero di telefono senza spazi e senza la spazzatura vista nei campioni.

Ad esempio:

questo:

provare prima 0770 0.000.694 poi a casa

dovrebbe diventare questa:

Qualsiasi cosa senza un numero di telefono (es. "VEDERE LE NOTE") dovrebbe essere nullo.

UPDATE:

Grazie per le risposte grande! Abbiamo avuto alcune risposte interessanti, ma visto che nessuna delle risposte SQL ha avuto voti è difficile scegliere un preferito. Avrei preferito vedere un chiaro preferito scelto dalla comunità.

Farò maturare la domanda un po 'di più e vedere se arrivano i voti prima di assegnare una risposta.

+0

Perché i downvotes? Questa è una domanda di programmazione per risolvere un problema che devo affrontare oggi. Si prega di commentare se si è a valle. –

risposta

2

Supponendo che yopur telefoni iniziano sempre con '07' e la lunghezza è di 12 caratteri si può provare qualcosa di simile:

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),' ','') 

Prima di tutto, trovare il punto di partenza della stringa '07', poi , se è 0 ('SEE SEE'), restituisce Null. Quindi, ottenendo i 12 caratteri del numero. Infine, sostituendo gli spazi ...

+0

Mi piace questa soluzione, anche se presumi che il numero abbia sempre degli spazi. Suppongo di non aver inserito un campione senza spazi nei miei dati di esempio, quindi il mio male! ;-) Può essere facilmente risolto facendo prima la sostituzione e assumendo invece una lunghezza di 11. –

0

In base ai campioni, sembra che nella maggior parte dei casi sia necessario rimuovere tutti i caratteri e gli spazi non numerici dalla stringa (non richiamo la funzione SQL per questo, ma è banale). L'unica eccezione è con cose come "1st" o "2nd", e potresti eliminarle prima di rimuovere i caratteri non numerici con un gruppo di istruzioni di tipo REPLACE('1ST','').

Ci possono essere molte più strane situazioni nei dati in cui le persone includono cifre reali che non fanno realmente parte del loro numero di telefono. Non sono sicuro di come trovi e correggi tutti questi, a parte occupandoti di loro ogni volta che ti capita di individuarli.

Ci sono senza dubbio molti componenti di terze parti che gestiscono l'analisi del numero di telefono, ma non so se possono essere utilizzati direttamente da SQL Server. Probabilmente alcuni di loro possono, a seconda della versione di SQL Server. Una ricerca su Google su "numeri di telefono di analisi in SQL Server" offre un sacco di opzioni.

0

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

set di risultati @ = ''
SELEZIONA
@result = @ risultato + CASO QUANDO numero LIKE '[0-9]' quindi il numero ELSE '' END DA
(
SOTTOSTRINGA SELECT (@ test, il numero, 1) AS numero da
(
SELEZIONA nUMERO da maestro. .spt_valu es WHERE type = 'p' e il numero compreso tra 1 e len (@test)
) AS Temp
) AS Temp
SELEZIONA @result

Come MusicGenesis dice, però, si ha a che fare con qualcosa di simile prima e Secondo separatamente.

0

Sembra che si potrebbe fare un passo avanti alla ricerca di lunghe stringhe contigue di numeri: (rapida & sporca)

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

La soluzione sono venuto in mente finora è la seguente:

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 

Tuttavia, questo non riguarderà la spazzatura all'inizio del numero di telefono.

Presuppone inoltre che un numero di telefono (senza spazi) sia lungo 11 caratteri, il che mi consente di gestire i caratteri numerici che non fanno parte del numero di telefono (come nella risposta di MusiGenesis).

+0

Attenzione con ISNumeric, restituirà anche 1 per i simboli di valuta validi. L'elenco di tali simboli è http://msdn.microsoft.com/en-us/library/ms188688.aspx – Jon

+0

Grazie Jon, è molto interessante. –

+0

Potrebbe essere possibile aggirare il problema con i simboli di valuta aggiungendo .0e0 al numero di telefono prima di eseguire ISNUMERIC. –

1

La soluzione migliore è quella di correggere i dati. Se non è possibile correggere i dati, inserire un nuovo campo calcolato che rimuove i caratteri che non si desidera. In ogni caso, inizia ora a mettere i controlli sul campo di inserimento dati nella tua applciation. Non vuoi onestamente sprecare potenza di elaborazione, fai questo tipo di manipolazione dei dati con ogni query, fallo una sola volta quando si immette dat e si fa con esso.

+0

Sono pienamente d'accordo con te. Fortunatamente questa è una query one shot oggi, non faremo questo tipo di report spesso. Questi dati provengono da un sistema legacy da cui stiamo migrando. La nostra convalida dei dati è molto meglio nel nuovo sistema, non avremo questo problema. –

Problemi correlati