Convertir des valeurs numériques de chaîne avec une virgule comme séparateur décimal en NUMÉRIQUE (10, 2)


12

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?

Réponses:


10

( Si vous utilisez SQL Server 2012 ou une version plus récente, veuillez consulter la réponse de @ wBob 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 une version antérieure. )

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 CONVERT , mais rien ne s'applique ici.

  • La fonction FORMAT , mais le type d'entrée doit être une valeur numérique ou date / heure / date / heure (qui a été introduite dans SQL Server 2012, donc non applicable à 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 REPLACEappels, 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

10

Quelle version de SQL Server utilisez-vous? À partir de SQL Server 2012, vous pouvez utiliser TRY_PARSE avec son USING cultureargument. Vous pouvez également utiliser PARSE , la différence étant PARSEéchouera si la conversion échoue et TRY_PARSErenverra 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

résultats de test

HTH


1
Je viens d'ajouter une note en haut de ma réponse, en dirigeant les lecteurs ici s'ils utilisent SQL Server 2012 ou une version plus récente.
Solomon Rutzky

0

Le code suivant a fonctionné dans mon cas:

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

sortie: 123.456.789,03


ou sélectionnez convert (varchar, FORMAT (cast (yourValue as numeric (10,2)), '###, ###, ###. 00', 'de-de'))
Shahed Adnan

2
il semble que vous répondiez au problème inverse de ce que le PO a demandé. ils ne veulent pas formater des valeurs numériques, ils veulent convertir des valeurs varchar formatées en numérique.
ypercubeᵀᴹ

1
En outre, deux notes: 1) indiquent toujours une longueur pour VARCHAR, NVARCHAR, CHARet NCHARtypes. La valeur par défaut est 30 dans certains cas et 1 dans d'autres cas, ce qui rend le code non gérable / sujet aux erreurs. 2) vous n'avez pas besoin de la disposition exacte lors de l'utilisation #. Vous avez juste besoin d'un d'entre eux (par exemple #) pour tous les chiffres mais pas de séparateur de milliers, ou deux d'entre eux séparés par une virgule (par exemple #,#) pour obtenir tous les chiffres et le séparateur de milliers. Par conséquent, SELECT CONVERT(VARCHAR(20), FORMAT(123456789.0258, N'#,#.00', N'de'));renvoie la même sortie que ce que vous proposez.
Solomon Rutzky
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.