Ondalık ayırıcı olarak virgülle dize sayısal değerlerini NUMERIC (10, 2) biçimine dönüştürme


12

Yunanca biçimlendirilmiş sayılar (bin ayırıcı ve ondalık ayırıcı olarak virgül olarak) içeren varchar sütunlarının bir SQL tablo var

Klasik dönüşüm

CONVERT(numeric(10,2),REPLACE([value],',','.'))

çalışmıyor çünkü. (binlik ayırıcı) dönüşümü öldürür

Örneğin dene

CONVERT(numeric(10,2),REPLACE('7.000,45',',','.'))

Bu değerleri sayısal olarak dönüştürmek istiyorum (10,2)

Bununla nasıl başa çıkacağınıza dair herhangi bir öneriniz var mı?

Yanıtlar:


10

( SQL Server 2012 veya daha yenisini kullanıyorsanız, lütfen daha temiz bir yaklaşım için @ wBob'un cevabına bakın. Aşağıdaki cevabımda özetlenen yaklaşım yalnızca SQL Server 2008 R2 veya daha yenisini kullanıyorsanız gereklidir. )

NUMERICVirgül, nokta veya boşluk olsun, dönüştürürken binlerce ayırıcıya ihtiyacınız yoktur (veya istemezsiniz) , bu yüzden önce onlardan kurtulun. Sonra virgül bir noktaya / ondalık sayıya dönüştürülür ve işlem tamamlanır:

SELECT CONVERT(NUMERIC(10, 2), 
               REPLACE(
                       REPLACE('7.000,45', '.', ''),
                       ',', '.'
                      )
              ) AS [Converted];

İadeler:

7000.45

Tamlık uğruna şunu da denemeliyim:

  • SET LANGUAGE Greek;

  • CONVERT için çeşitli format stillerine bakmakla birlikte , burada hiçbir şey geçerli değildir.

  • FORMAT fonksiyonu, ancak giriş türü (SQL Server 2008 R2 için geçerli veya daha büyük değil ve SQL Server 2012'de tanıtıldı olduğunu,) sayısal veya tarih / saat / tarih saat değeri olmalıdır.

Ve hiçbir şey işe yaramadı. İki REPLACEçağrıdan daha zarif bir şey bulmayı umuyordum , ama şimdiye kadar böyle bir şans yok.


Ayrıca, sadece bahsetmek gerekirse, saf bir T-SQL çözümü olmasa da, bu SQLCLR ile de gerçekleştirilebilir. Ve bunu String_TryParseToDecimal adlı SQL # kitaplığında (yazdığım) yapan önceden yapılmış bir işlev var . Bu işlev Ücretsiz sürümde kullanılabilir ve SQL Server 2005'ten başlayarak SQL Server'ın her sürümünde çalışır:

SELECT SQL#.String_TryParseToDecimal('7.000,45', 'el-GR');

İadeler:

7000.45000000000000000000

10

Hangi SQL Server sürümünü kullanıyorsunuz? SQL Server 2012'den itibaren argümanı ile TRY_PARSE kullanabilirsiniz USING culture. Ayrıca kullanabilirsiniz ayrıştırmak , fark varlık PARSEdönüşüm başarısız olursa başarısız olur ve TRY_PARSEbir döner NULL, örneğin

DECLARE @t TABLE ( x VARCHAR(10) )

INSERT INTO @t
VALUES ( '7.000,45' ), ( 'xxx' )

SELECT x, 
    TRY_PARSE( x AS NUMERIC(10,2) USING 'El-GR' ) x
FROM @t

Test sonuçları

HTH


2
SQL Server 2012 veya daha yeni bir sürümü kullanıyorsa okuyucuları yönlendirerek cevabımın en üstüne bir not ekledim.
Solomon Rutzky

0

Benim durumumda aşağıdaki kod çalıştı:

select convert(varchar,FORMAT(123456789.0258,'###,###,###.00','de-de'))

çıktı: 123.456.789,03


veya convert (varchar, FORMAT (cast (sayısal olarak değeriniz (10,2)), '###, ###, ###. 00', 'de-de'))
Shahed Adnan

3
Görünüşe göre OP'nin sorduğu sorunun tersini yanıtlıyorsunuz. sayısal değerleri biçimlendirmek istemiyorlar, biçimlendirilmiş varchar değerlerini sayısal değere dönüştürmek istiyorlar.
ypercubeᵀᴹ

1
Ayrıca, iki notlar: 1) Her zaman için bir uzunluk belirtmek VARCHAR, NVARCHAR, CHAR, ve NCHARtürleri. Varsayılan, bazı durumlarda 30 ve diğer durumlarda 1'dir, bu da sürdürülemez / hataya açık kod sağlar. 2) kullanırken tam düzeni gerekmez #. #Tüm basamaklar için bunlardan birine (ör. ) İhtiyacınız vardır, ancak binlik basamak ayırıcıya sahip değildir veya ikisinin #,#tüm basamakları ve binlik basamak ayırıcısını almak için virgülle (ör. ) Ayrılması gerekir. Bu nedenle, SELECT CONVERT(VARCHAR(20), FORMAT(123456789.0258, N'#,#.00', N'de'));önerdiğinizle aynı çıktıyı döndürür.
Solomon Rutzky
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.