Ada beberapa masalah yang berbeda semua datang bersama-sama di sini pada waktu yang sama. Mari kita lihat beberapa di antaranya:
-
Anda memberikan angka sebagai DECIMAL (18, 18). Artinya adalah "beri saya nomor yang memiliki ruang untuk TOTAL 18 karakter, dan 18 di antaranya harus setelah desimal". Itu berfungsi dengan baik selama nomor Anda lebih kecil dari 0 (yang berlaku untuk semua nomor E) tetapi akan rusak jika Anda mencoba menggunakannya pada angka> 0. Untuk angka> 0, cukup masukkan sebagai DECIMAL tanpa menentukan hal lain .
-
Dalam kasus di mana Anda menambahkan "KETIKA @d like '%E+%' THEN CAST(@d AS FLOAT)", Anda mendapatkan hasil yang berbeda untuk angka <0 karena mesin secara implisit memberikan hasil secara berbeda. Saya tidak tahu aturan tentang bagaimana sql server memutuskan untuk memberikan hasil KASUS, tetapi tampaknya membuat perubahan yang Anda usulkan menyebabkan mesin menyusunnya kembali dengan cara yang berbeda. Mentransmisikan hasil tersebut secara eksplisit sebagai desimal memperbaiki masalah.
-
Anda perlu LTRIM dan RTRIM hasil Anda secara konsisten. Anda dapat menambahkan LTRIM dan RTRIM ke setiap pernyataan kasus, atau Anda dapat menambahkan LTRIM dan RTRIM saja pada hasil kasus.
Inilah solusi yang harus benar-benar menyelesaikan semuanya:
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))