J'ai une table SQL de colonnes varchar qui contiennent des nombres au format grec (. Comme mille séparateur et virgule comme séparateur décimal)
La conversion classique
CONVERT(numeric(10,2),REPLACE([value],',','.'))
ne fonctionne pas car le. (mille séparateur) tue la conversion
Par exemple, essayez
CONVERT(numeric(10,2),REPLACE('7.000,45',',','.'))
Je veux convertir ces valeurs en numérique (10,2)
Des suggestions sur la façon de le gérer?
( Si vous utilisez SQL Server 2012 ou une version plus récente, veuillez consulter @ wBob réponse pour une approche plus propre. L'approche décrite dans ma réponse ci-dessous n'est requise que si vous utilisez SQL Server 2008 R2 ou plus.)
Vous n'avez pas besoin (ou ne voulez pas) du séparateur de milliers lors de la conversion en NUMERIC
, qu'il s'agisse d'une virgule, d'un point ou d'un espace, alors débarrassez-vous-en d'abord. Convertissez ensuite la virgule en un point/décimal et vous avez terminé:
SELECT CONVERT(NUMERIC(10, 2),
REPLACE(
REPLACE('7.000,45', '.', ''),
',', '.'
)
) AS [Converted];
Retour:
7000.45
Par souci d'exhaustivité, je dois mentionner que j'ai également essayé:
SET LANGUAGE Greek;
En regardant différents styles de format pour CONVERTIR , mais rien ne s'applique ici.
La fonction FORMAT , mais le type d'entrée doit être une valeur numérique ou date/heure/datetime (cela et il a été introduit dans SQL Server 2012, donc non applicable vers SQL Server 2008 R2 ou version antérieure).
Et rien d'autre ne semblait fonctionner. J'espérais trouver quelque chose de plus élégant que deux appels REPLACE
, mais jusqu'à présent, pas de chance.
De plus, juste pour mentionner, bien qu'il ne s'agisse pas d'une solution T-SQL pure, cela peut également être accompli via SQLCLR. Et, il existe une fonction prédéfinie qui fait cela dans la bibliothèque SQL # (que j'ai écrite) nommée String_TryParseToDecimal . Cette fonction est disponible dans la version gratuite et fonctionne dans toutes les versions de SQL Server à partir de SQL Server 2005:
SELECT SQL#.String_TryParseToDecimal('7.000,45', 'el-GR');
Retour:
7000.45000000000000000000
Quelle version de SQL Server utilisez-vous? À partir de SQL Server 2012, vous pouvez utiliser TRY_PARSE avec son USING culture
argument. Vous pouvez également utiliser PARSE , la différence étant PARSE
échouera si la conversion échoue et TRY_PARSE
renverra un NULL
, par exemple
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
HTH
Le code suivant a fonctionné dans mon cas:
select convert(varchar,FORMAT(123456789.0258,'###,###,###.00','de-de'))
sortie: 123.456.789,03