2017-10-19 29 views
2

De différentes sources externes, j'obtiens des données où certains nombres se trouvent dans un champ NVarChar. Jusqu'à présent, j'ai utilisé un remplacement avec un CAST pour assurer que les numéros avec un "," où la bonne façon. Comme ceci:Convertir VarChar en Float avec un format de culture différent

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

Cela a fonctionné très bien, mais maintenant j'obtenir des données où il y a aussi un millier de séparateur comme ceci:.

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

Il est cassé. Existe-t-il un moyen de détecter quel format de données est utilisé dans un NVarChar avec un numéro?

J'ai essayé d'utiliser TRY_PARSE avec un paramètre de culture, il fonctionne bien s'il y a un millier de séparateur, mais non sans:

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 

Le problème est que je dois utiliser une mise à jour et que ce le format de données peut différer dans la même table.

Des suggestions?

+0

Dites-nous quel format vous recherchez réellement ici. Il semble que vous allez dans les deux sens. –

Répondre

2

Vous pouvez utiliser CHARINDEX() pour travailler ce que les séparateurs sont présents et où ils se trouvent dans la chaîne avec une expression CASE pour traiter différents cas avant REPLACE et CAST à 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; 

Références:

CHARINDEX (Transact-SQL)

Recherche une expression pour une autre expression et renvoie sa position de départ si elle est trouvée.

+0

Merci Tanner J'ai utilisé votre solution. Je ne sais pas pourquoi je n'ai pas vu cette option moi-même, peut-être que j'étais tellement concentré pour chercher une fonction avec une sorte de paramètre de culture. –