2017-10-19 5 views
2

異なる外部ソースからいくつかの数値がNVarCharフィールドにあるデータを取得します。これまでは、CASTでREPLACEを使用して、数字が正しいかどうかを確認するための "、"が付いています。このように:VarCharを異なるカルチャフォーマットでFloatに変換する

select cast(replace('12,5',',','.') as float) 
select cast(replace('12.5',',','.') as float) 

これがうまく働いたが、今は千話の区切りがでもあり、データを取得し、次のように:。

select cast(replace('2.012,5',',','.') as float) 
select cast(replace('2,012.5',',','.') as float) 

それは壊れました。 NVarCharで数値を使用するデータ形式を検出する方法はありますか?

私は千話の区切りがある場合、それはうまく動作しますが、ないわけではない、文化パラメータでTRY_PARSEを使用しようとしました:

SELECT @Fuelunits = 
CASE 
    WHEN ISNUMERIC(TRY_PARSE(@Hoeveelheid AS decimal(9,2) USING 'nl-NL')) = 1 
THEN CAST(TRY_PARSE(@Hoeveelheid AS decimal(9,2) USING 'nl-NL') AS FLOAT) 
ELSE CAST(TRY_PARSE(@Hoeveelheid AS decimal(9,2) USING 'en-US') AS FLOAT) 
END 

問題は、私はUPDATEでこれを使用しなければならないことであり、そのことを同じ表でデータ形式が異なる場合があります。

提案がありますか?

あなたはセパレータが存在し、どのような動作するように CHARINDEX()を使用することができます
+0

あなたが実際に探しているフォーマットを教えてください。あなたは往来しているようです。 –

答えて

2

彼らはFLOATにあなたREPLACECAST前に別のケースを処理するためにCASE表現と一緒に、文字列のどこにいるか:

CREATE TABLE #vals (val NVARCHAR(10)); 

INSERT INTO #vals 
(
    val 
) 
VALUES 
(N'2.012,5'), 
(N'2,012.5'); 

SELECT CAST(CASE 
       -- is there a '.' in a position before a ','? 
       WHEN CHARINDEX('.', val) < CHARINDEX(',', val) THEN 
        -- yes - remove the '.' and replace the ',' with '.' 
        REPLACE(REPLACE(val, '.', ''), ',', '.') 
       ELSE 
        -- no - just remove the ',' 
        REPLACE(v.val, ',', '') 
      END AS FLOAT) 
FROM #vals AS v; 

DROP TABLE #vals; 

参考文献:

CHARINDEX (Transact-SQL)

式に別の式を検索し、見つかった場合は開始位置を返します。

+0

ありがとうTanner 私はあなたのソリューションを使いました。なぜ私はこのオプションが私の自己を見なかったのか分かりません。何らかの文化設定で機能を探すために集中していたのかもしれません。 –

関連する問題