Konversi nilai numerik string dengan koma sebagai pemisah desimal menjadi NUMERIC (10, 2)

12

Saya memiliki tabel SQL kolom varchar yang berisi angka berformat Yunani (. Sebagai pemisah ribuan dan koma sebagai pemisah desimal)

Konversi klasik

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

tidak berfungsi karena. (seribu pemisah) membunuh konversi

Misalnya mencoba

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

Saya ingin mengonversi nilai tersebut menjadi numerik (10,2)

Ada saran tentang cara menanganinya?

PanosPlat
sumber

Jawaban:

10

( Jika Anda menggunakan SQL Server 2012 atau yang lebih baru, silakan lihat jawaban @ wBob untuk pendekatan yang lebih bersih. Pendekatan yang dijabarkan dalam jawaban saya di bawah ini hanya diperlukan jika Anda menggunakan SQL Server 2008 R2 atau lebih lama. )

Anda tidak perlu (atau ingin) pemisah ribuan saat mengkonversi NUMERIC, terlepas dari apakah itu koma, titik, atau ruang, jadi singkirkan saja dulu. Kemudian konversikan koma menjadi titik / desimal dan Anda selesai:

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

Pengembalian:

7000.45

Demi kelengkapan, saya harus menyebutkan bahwa saya juga mencoba:

  • SET LANGUAGE Greek;

  • Melihat berbagai gaya format untuk CONVERT , tetapi tidak ada yang berlaku di sini.

  • Fungsi FORMAT , tetapi tipe input harus berupa nilai numerik atau tanggal / waktu / waktu (itu dan itu diperkenalkan di SQL Server 2012, jadi tidak berlaku untuk SQL Server 2008 R2 atau lebih lama).

Dan sepertinya tidak ada yang berhasil. Saya berharap untuk menemukan sesuatu yang lebih elegan daripada dua REPLACEpanggilan, tetapi sejauh ini tidak ada keberuntungan.


Juga, hanya untuk menyebutkan, meskipun bukan solusi T-SQL murni, ini juga dapat dicapai melalui SQLCLR. Dan, ada fungsi pra-selesai yang melakukan ini di perpustakaan SQL # (yang saya tulis) bernama String_TryParseToDecimal . Fungsi ini tersedia dalam versi Gratis, dan berfungsi di setiap versi SQL Server dimulai dengan SQL Server 2005:

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

Pengembalian:

7000.45000000000000000000
Solomon Rutzky
sumber
10

Apa versi SQL Server yang Anda gunakan? Dari SQL Server 2012 dan selanjutnya Anda dapat menggunakan TRY_PARSE dengan USING cultureargumennya. Anda juga dapat menggunakan PARSE , perbedaannya PARSEakan gagal jika konversi gagal dan TRY_PARSEakan mengembalikan NULL, misalnya

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

hasil tes

HTH

wBob
sumber
1
Saya baru saja menambahkan catatan ke bagian atas jawaban saya, mengarahkan pembaca di sini jika mereka menggunakan SQL Server 2012 atau yang lebih baru.
Solomon Rutzky
0

Kode berikut berfungsi dalam kasus saya:

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

output: 123.456.789,03

Shahed Adnan
sumber
atau pilih convert (varchar, FORMAT (cast (YourValue as numeric (10,2)), '###, ###, ###. 00', 'de-de'))
Shahed Adnan
2
sepertinya Anda menjawab masalah sebaliknya dari apa yang diminta OP. mereka tidak ingin memformat nilai numerik, mereka ingin mengonversi nilai varchar yang diformat menjadi angka.
ypercubeᵀᴹ
1
Juga, dua catatan: 1) selalu menentukan panjang untuk VARCHAR, NVARCHAR, CHAR, dan NCHARjenis. Standarnya adalah 30 dalam beberapa kasus dan 1 dalam kasus lain, yang membuat kode yang tidak dapat dipelihara / rawan kesalahan. 2) Anda tidak perlu tata letak yang tepat saat menggunakan #. Anda hanya perlu satu dari mereka (mis. #) Untuk semua digit tetapi tidak ada pemisah ribuan, atau dua dari mereka dipisahkan oleh koma (mis. #,#) Untuk mendapatkan semua digit dan pemisah ribuan. Karenanya, SELECT CONVERT(VARCHAR(20), FORMAT(123456789.0258, N'#,#.00', N'de'));kembalikan output yang sama dengan yang Anda sarankan.
Solomon Rutzky