web-dev-qa-db-ja.com

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

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

古典的な変換

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

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

例:

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

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

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

12
PanosPlat

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

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

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

戻り値:

7000.45

完全を期すために、私も試したことを述べておかなければなりません。

  • SET LANGUAGE Greek;

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

  • [〜#〜] format [〜#〜] 関数ですが、入力タイプは数値または日付/時刻/日付時刻値でなければなりません(それはSQL Server 2012で導入されたため、適用されません) SQL Server 2008 R2以前)。

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


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

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

戻り値:

7000.45000000000000000000
10
Solomon Rutzky

SQL Serverのどのバージョンを使用していますか? SQL Server 2012以降では、USING culture引数を指定して TRY_PARSE を使用できます。 [〜#〜] parse [〜#〜] を使用することもできます。変換が失敗した場合、PARSEの違いは失敗し、TRY_PARSENULLを返します。例:

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

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

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

出力:123.456.789,03

0
Shahed Adnan