Rimozione di dati non numerici da un numero + SQL
-
08-07-2019 - |
Domanda
Sto cercando di trovare il modo migliore per rimuovere dati non numerici da un varchar in SQL, ad esempio
'(082) 000-0000' to '0820000000' or
'+2782 000 0000' to '0820000000'
La difficoltà è che non sono sempre sicuro di quali siano i formati numerici, come mostrato sopra, quindi mi piacerebbe che tutto ciò che non fosse un numero fosse rimosso in sostanza.
Aggiornamento:
Da quello che avete detto, questo è un piccolo picco:
declare @Num varchar(20)
set @Num = ' + (82) 468 6152 '
--strip nonnumrical data out of @num
print @Num
set @Num = replace(@Num, ' ', '')
set @Num = replace(@Num, '+', '')
set @Num = replace(@Num, '-', '')
set @Num = replace(@Num, '(', '')
set @Num = replace(@Num, ')', '')
print @Num
Impossibile ottenere l'espressione di sostituzione [^ 0-9], tuttavia.
Soluzione
Se si utilizza SQL Server 2005 o versioni successive, l'opzione migliore è creare un funzione CLR definita dall'utente e usa un'espressione regolare per rimuovere tutti i caratteri non numerici.
Se non si desidera utilizzare una funzione CLR, è possibile creare una funzione standard definita dall'utente. Questo farà il lavoro anche se non sarà altrettanto efficiente:
CREATE FUNCTION dbo.RemoveNonNumerics(@in VARCHAR(255))
RETURNS VARCHAR(255)
AS
BEGIN
DECLARE @out VARCHAR(255)
IF (@in IS NOT NULL)
BEGIN
SET @out = ''
WHILE (@in <> '')
BEGIN
IF (@in LIKE '[0-9]%')
SET @out = @out + SUBSTRING(@in, 1, 1)
SET @in = SUBSTRING(@in, 2, LEN(@in) - 1)
END
END
RETURN(@out)
END
E quindi seleziona dalla tua tabella in questo modo:
SELECT dbo.RemoveNonNumerics(your_column) AS your_tidy_column
FROM your_table
Altri suggerimenti
Dai un'occhiata a questo post (è l'ottavo post down - il primo LONG) che descrive in dettaglio come utilizzare le espressioni regolari in SQL Server. Non è il più veloce (che sarebbe farlo prima di arrivare a SQL) ma offre un modo decente per farlo.
Esistono diverse opzioni per questo, a seconda del tuo DBMS.
Per T-SQL, questo link ha alcuni buoni approcci.
È molto più semplice gestire l'analisi delle stringhe nel livello aziendale. Tuttavia, baring che utilizza la funzione T-SQL REPLACE () (presupponendo MS SQL).
Potresti fare un ciclo con quella funzione sul parametro che è stato passato per rimuovere tutte le lettere non numeriche da esso.
Che tipo di backend SQL stai usando? Se esiste un tipo di funzione regexp_replace, puoi usarlo per sostituire [^ 0-9] con nulla.
Il più efficace e flessibile che ho trovato sta usando il metodo della tabella dei numeri / tally come mostrato nella risposta di mwigdahl del 10 marzo 2009
vale a dire. un elenco di autorizzazioni è molto più sicuro dell'elenco di non autorizzazione che hai inserito in fondo alla domanda precedente.
Quello che non hai dichiarato è come gestisci i non numeri interi ... cosa fai con i punti decimali?