sql >> データベース >  >> RDS >> Sqlserver

ビューでの科学的記数法のキャスト(varchar->数値から)

    ここには、いくつかの異なる問題が同時に発生しています。それらのいくつかを見てみましょう:

    1. 数値をDECIMAL(18、18)としてキャストしています。つまり、「合計18文字のスペースがある数値を教えてください。そのうち、18文字は小数点以下である必要があります」。数値が0未満(すべてのE番号に当てはまります)であれば問題なく動作しますが、0より大きい数値で使用しようとすると壊れます。0より大きい数値の場合は、他に何も指定せずにDECIMALとしてキャストするだけです。 。

    2. 「WHEN@d like'%E +%' THEN CAST(@d AS FLOAT)」を追加した場合、エンジンが暗黙的に結果を異なる方法でキャストしているため、0未満の数値に対して異なる結果が得られます。 SQL ServerがCASEの結果をキャストする方法についてのルールはわかりませんが、提案された変更を行うと、エンジンが別の方法でキャストし直すようになります。これらの結果を10進数として明示的にキャストすると、問題が修正されます。

    3. 結果を一貫してLTRIMおよびRTRIMする必要があります。 LTRIMとRTRIMを各caseステートメントに追加することも、LTRIMとRTRIMだけでケースの結果を追加することもできます。

    すべてを完全に解決する必要があるソリューションは次のとおりです。

    SELECT
        LTRIM(RTRIM(CASE 
            WHEN @d like '%E-%' THEN CAST(CAST(@d AS FLOAT) AS DECIMAL(18,18))
            WHEN @d like '%E+%' THEN CAST(CAST(@d AS FLOAT) AS DECIMAL)
            ELSE @d
        END))
    


    1. MySQLは重複キーに挿入します。消去?

    2. mysqlselectステートメントにtable.fieldのような完全修飾列名を返すようにします

    3. MySQL:単一のクエリを使用して複数のテーブルを削除する方法は?

    4. コンカレントマネージャで設定されたリクエスト