2017-10-19 4 views
2

Aus verschiedenen externen Quellen bekomme ich Daten, in denen sich einige Zahlen in einem NVarChar-Feld befinden. Bis jetzt habe ich einen REPLACE mit einem CAST verwendet, um sicherzustellen, dass Zahlen mit einem "," in die richtige Richtung geworfen werden. Wie folgt aus:VarChar in Float mit unterschiedlichem Kulturformat konvertieren

select cast(replace('12,5',',','.') as float) 
select cast(replace('12.5',',','.') as float) 

Das hat funktioniert ganz gut, aber jetzt habe ich Daten bekommen, wo es auch ein Tausendertrennzeichen in wie folgt aus:.

select cast(replace('2.012,5',',','.') as float) 
select cast(replace('2,012.5',',','.') as float) 

Es gebrochen. Gibt es eine Möglichkeit festzustellen, welches Datenformat in einem NVarChar mit einer Nummer verwendet wird?

Ich habe versucht, TRY_PARSE mit einem Kultur Parameter zu verwenden, es funktioniert gut, wenn es ein Tausendertrennzeichen, aber nicht ohne:

SELECT @Fuelunits = 
CASE 
    WHEN ISNUMERIC(TRY_PARSE(@Hoeveelheid AS decimal(9,2) USING 'nl-NL')) = 1 
THEN CAST(TRY_PARSE(@Hoeveelheid AS decimal(9,2) USING 'nl-NL') AS FLOAT) 
ELSE CAST(TRY_PARSE(@Hoeveelheid AS decimal(9,2) USING 'en-US') AS FLOAT) 
END 

Das Problem ist, dass ich dies in einer UPDATE verwenden müssen und dass diese Das Datenformat kann in derselben Tabelle abweichen.

Irgendwelche Vorschläge?

+0

Sagen Sie uns, welches Format Sie eigentlich suchen. Es scheint, dass du hin und her gehst. –

Antwort

2

Sie CHARINDEX() verwenden können, um herauszufinden, was Separatoren vorhanden sind und wo sie in der Kette sind zusammen mit einem CASE Ausdruck verschiedene Fälle zu behandeln, bevor Sie REPLACE und CAST zu FLOAT:

CREATE TABLE #vals (val NVARCHAR(10)); 

INSERT INTO #vals 
(
    val 
) 
VALUES 
(N'2.012,5'), 
(N'2,012.5'); 

SELECT CAST(CASE 
       -- is there a '.' in a position before a ','? 
       WHEN CHARINDEX('.', val) < CHARINDEX(',', val) THEN 
        -- yes - remove the '.' and replace the ',' with '.' 
        REPLACE(REPLACE(val, '.', ''), ',', '.') 
       ELSE 
        -- no - just remove the ',' 
        REPLACE(v.val, ',', '') 
      END AS FLOAT) 
FROM #vals AS v; 

DROP TABLE #vals; 

Referenzen:

CHARINDEX (Transact-SQL)

Durchsucht einen Ausdruck nach einem anderen Ausdruck und gibt die Startposition zurück, wenn er gefunden wird.

+0

Danke Tanner Ich habe deine Lösung benutzt. Ich weiß nicht, warum ich diese Option nicht selbst gesehen habe, vielleicht war ich so konzentriert, um nach einer Funktion mit einer Art Kultureinstellung zu suchen. –