Konvertieren Sie numerische Zeichenfolgenwerte mit Komma als Dezimaltrennzeichen in NUMERIC (10, 2).

12

Ich habe eine SQL-Tabelle mit Varchar-Spalten, die griechisch formatierte Zahlen enthalten (. Als Tausendertrennzeichen und Komma als Dezimaltrennzeichen).

Der klassische Umbau

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

funktioniert nicht, weil die. (Tausendertrennzeichen) beendet die Konvertierung

ZB versuchen

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

Ich möchte solche Werte in numerische (10,2) konvertieren.

Irgendwelche Vorschläge, wie man damit umgeht?

PanosPlat
quelle

Antworten:

10

( Wenn Sie SQL Server 2012 oder neuer verwenden, finden Sie in der Antwort von @ wBob einen saubereren Ansatz. Der in meiner Antwort unten beschriebene Ansatz ist nur erforderlich, wenn Sie SQL Server 2008 R2 oder älter verwenden. )

Sie brauchen (oder wollen) nicht das Tausendertrennzeichen, wenn Sie in konvertieren NUMERIC, unabhängig davon, ob es sich um Komma, Punkt oder Leerzeichen handelt. Entfernen Sie sie also zuerst. Dann konvertieren Sie das Komma in einen Punkt / eine Dezimalstelle und Sie sind fertig:

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

Kehrt zurück:

7000.45

Der Vollständigkeit halber sollte ich erwähnen, dass ich auch versucht habe:

  • SET LANGUAGE Greek;

  • Betrachtet man verschiedene Formatstile für CONVERT , so gilt hier nichts.

  • Die FORMAT- Funktion, aber der Eingabetyp muss ein numerischer Wert oder ein Wert für Datum / Uhrzeit / Datum / Uhrzeit sein (dieser und dieser wurde in SQL Server 2012 eingeführt und gilt daher nicht für SQL Server 2008 R2 oder älter).

Und sonst schien nichts zu funktionieren. Ich hatte gehofft, etwas eleganteres als zwei REPLACEAnrufe zu finden, aber bisher kein solches Glück.


Um nur zu erwähnen, dass dies keine reine T-SQL-Lösung ist, kann dies auch über SQLCLR erreicht werden. Und es gibt eine vorgefertigte Funktion in der SQL # -Bibliothek (die ich geschrieben habe) mit dem Namen String_TryParseToDecimal . Diese Funktion ist in der kostenlosen Version verfügbar und funktioniert in jeder Version von SQL Server ab SQL Server 2005:

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

Kehrt zurück:

7000.45000000000000000000
Solomon Rutzky
quelle
10

Welche Version von SQL Server verwenden Sie? Ab SQL Server 2012 können Sie TRY_PARSE mit seinem USING cultureArgument verwenden. Sie können auch verwenden PARST , wobei der Unterschied darin PARSEversagt , wenn die Konvertierung fehlschlägt und TRY_PARSEwerden wieder ein NULL, zB

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

Testergebnisse

HTH

wBob
quelle
1
Ich habe gerade eine Notiz oben in meine Antwort eingefügt, um die Leser hierher zu leiten, wenn sie SQL Server 2012 oder neuer verwenden.
Solomon Rutzky
0

Der folgende Code hat in meinem Fall funktioniert:

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

Ausgabe: 123.456.789,03

Shahed Adnan
quelle
oder wählen Sie konvertieren (varchar, FORMAT (cast (IhrWert als numerisch (10,2)), '###, ###, ###. 00', 'de-de'))
Shahed Adnan
2
Es scheint, dass Sie das umgekehrte Problem der OP beantworten. Sie möchten keine numerischen Werte formatieren, sondern formatierte Varchar-Werte in numerische Werte konvertieren.
Ypercubeᵀᴹ
1
Auch zwei Noten: 1) geben immer eine Länge für VARCHAR, NVARCHAR, CHAR, und NCHARTypen. Der Standardwert ist in einigen Fällen 30 und in anderen Fällen 1, was zu nicht wartbarem / fehleranfälligem Code führt. 2) Sie benötigen nicht das genaue Layout, wenn Sie verwenden #. Sie benötigen nur eine davon (z. B. #) für alle Ziffern, aber kein Tausendertrennzeichen, oder zwei von ihnen durch ein Komma getrennt (z. B. #,#), um alle Ziffern und das Tausendertrennzeichen zu erhalten. Gibt daher SELECT CONVERT(VARCHAR(20), FORMAT(123456789.0258, N'#,#.00', N'de'));die gleiche Ausgabe zurück, die Sie vorschlagen.
Solomon Rutzky