web-dev-qa-db-fra.com

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

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?

12
PanosPlat

( 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
10
Solomon Rutzky

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

test results

HTH

10
wBob

Le code suivant a fonctionné dans mon cas:

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

sortie: 123.456.789,03

0
Shahed Adnan