2009-03-10 15 views
3

Sayısal olmayan verileri SQL'de bir varchar'dan kaldırmanın en iyi yolunu buluyorum.Sayısal olmayan verileri bir sayının dışına çıkarma + SQL

'(082) 000-0000' to '0820000000' or 
'+2782 000 0000' to '0820000000' 

zorluk her zaman yukarıda gösterildiği gibi neyi sayı biçimleri, geliyor emin değilim, bu yüzden aslında kaldırılmış bir sayı değil her şey gibi istiyorum.

Güncelleme: siz bu biraz başak yapmış olduğunu söyledi kadarıyla
:

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 

sağ olsa yerine [^ 0-9] ifadesini alınamadı.

+0

ms sql kullanıyor musunuz? –

+0

Ah, başka bir Güney Afrika (ya da en azından Güney Afrika ile ilgilenen biri) SO buluyor –

+0

Üzgünüm Çocuklar, Evet MS SQL kullanıyorum;) –

cevap

3

SQL Server 2005 veya daha yenisini kullanıyorsanız, en iyi seçeneğiniz user-defined CLR function oluşturmak ve tüm sayısal olmayan karakterleri kaldırmak için normal bir ifade kullanmaktır.

Bir CLR işlevi kullanmak istemiyorsanız, standart kullanıcı tanımlı bir işlev oluşturabilirsiniz.

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 

Ve sonra şöyle sofranızdan seçmek: buldum ki en etkili ve esnek

SELECT dbo.RemoveNonNumerics(your_column) AS your_tidy_column 
FROM your_table 
+0

Teşekkürler Luke, sql 2000 var, bu yüzden böyle bir şey için gidiyoruz. :) –

0

İş katmanınızda dizgi ayrıştırmayı işlemek çok daha kolaydır. Ancak, T-SQL REPLACE() işlevini kullanan (MS SQL varsayarak) barikat.

Sayısal olmayan tüm harfleri çıkartmak için iletilen parametrede bu işleve sahip bir döngü oluşturabilirsiniz.

1

SQL Server'da düzenli ifadelerin nasıl kullanılacağını detaylandıran this post (8. gönderi sonrası - ilk LONG olanı) bölümüne bakın. En hızlı değil (SQL'e ulaşmadan önce bunu yapar) ama bunu yapmak için iyi bir yol sağlar.

0

SQL arka ucunu nasıl kullanıyorsunuz? Bir regexp_replace türü işlev varsa, bunu [^ 0-9] yerine hiçbir şeyle değiştirmek için kullanabilirsiniz.

1

DBMS'nize bağlı olarak bunun için birkaç farklı seçenek vardır.

T-SQL için this link bazı iyi yaklaşımlara sahiptir.

0

numaralarını kullanarak bir o kadar etkili olmasa da bu işi yapacak mfuldahl'ın 10 Mart 2009 tarihli cevabında gösterildiği gibi/tally tablosu yöntemi, yukarıdaki listenin altına koyduğunuz izin listesinden çok daha güvenli bir izin listesidir.

Tam olarak belirtmediğiniz, tamsayı olmayanlarla nasıl başa çıktığınızdır ... ondalık sayılarla ne yaparsınız?

İlgili konular