小数点記号としてコンマを使用した文字列数値をNUMERIC(10、2)に変換します


12

私はギリシャ語でフォーマットされた数値を含むvarchar列のSQLテーブルを持っています(千の区切り文字として。そして小数点の区切り文字としてコンマ)

古典的な変換

CONVERT(numeric(10,2),REPLACE([value],',','.'))

ので機能しません。(千区切り)変換を強制終了します

たとえば試してください

CONVERT(numeric(10,2),REPLACE('7.000,45',',','.'))

そのような値をnumeric(10,2)に変換したい

それを処理する方法の提案はありますか?

回答:


10

SQL Server 2012以降を使用している場合は、@ wBobの回答を参照して、よりクリーンな方法を確認してください。以下の私の回答で概説されている方法は、SQL Server 2008 R2以前を使用している場合にのみ必要です。

に変換するときにNUMERIC、コンマ、ピリオド、スペースのいずれであるかに関係なく、3 桁ごとの区切り文字は必要ない(または必要ない)ので、最初にそれらを削除してください。次に、コンマをピリオド/デシマルに変換すれば完了です。

SELECT CONVERT(NUMERIC(10, 2), 
               REPLACE(
                       REPLACE('7.000,45', '.', ''),
                       ',', '.'
                      )
              ) AS [Converted];

戻り値:

7000.45

完全を期すために、私も次のことを試みたことに言及する必要があります。

  • SET LANGUAGE Greek;

  • CONVERTのさまざまなフォーマットスタイルを調べますが、ここでは何も適用されません。

  • FORMATの機能が、入力タイプは、(そうSQL Server 2008のR2には適用歳以上でないと、それはSQL Serverの2012年に導入されたことを、)数値または日付/時刻/日付時刻値でなければなりません。

そして、他には何も機能していないようでした。私は2つのREPLACE電話よりもエレガントなものを見つけたいと思っていましたが、今のところ、そのような運はありません。


また、言及するだけで、純粋なT-SQLソリューションではありませんが、これはSQLCLRを介して実現することもできます。そして、SQL_ライブラリー(私が書いたもの)にString_TryParseToDecimalという名前の事前実行済み関数があります。この関数は無料バージョンで利用でき、SQL Server 2005以降のすべてのバージョンのSQL Serverで機能します。

SELECT SQL#.String_TryParseToDecimal('7.000,45', 'el-GR');

戻り値:

7000.45000000000000000000

10

SQL Serverのどのバージョンを使用していますか?SQL Server 2012以降では、引数を指定してTRY_PARSEを使用できUSING cultureます。PARSEを使用することもできます。PARSE変換が失敗してTRY_PARSEが返されると、違いが失敗しますNULL。たとえば、

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


1
回答の上部にメモを追加しました。SQLServer 2012以降を使用している場合は、ここに読者を誘導します。
ソロモンルツキー

0

次のコードは私の場合に機能しました:

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

出力:123.456.789,03


または、convert(varchar、FORMAT(cast(yourValue as numeric(10,2)))、 '###、###、###。00'、 'de-de'))を選択します
Shahed Adnan

2
OPの質問の逆の問題に答えているようです。彼らは数値をフォーマットしたくない、フォーマットされたvarchar値を数値に変換したい。
ypercubeᵀᴹ

1
また、2つのノート:1)は、常にのための長さを指定しVARCHARNVARCHARCHAR、およびNCHAR種類。デフォルトはある場合には30であり、他の場合には1であり、保守不能でエラーが発生しやすいコードになります。2)を使用する場合、正確なレイアウトは必要ありません##桁区切り記号を除くすべての桁で1つ(例:)、または#,#すべて桁桁区切り記号を取得するには、2つをコンマで区切って(例:)必要です。したがって、SELECT CONVERT(VARCHAR(20), FORMAT(123456789.0258, N'#,#.00', N'de'));あなたが提案しているものと同じ出力を返します。
ソロモンルツキー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.