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.

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top