Itu karena parameter 3 dari pernyataan decode Anda adalah NULL; sesuai dokumentasi (penekanan saya).
Oracle secara otomatis mengonversi expr dan setiap nilai pencarian ke tipe data dari nilai pencarian pertama sebelum membandingkan .... Jika hasil pertama memiliki tipe data CHAR atau jika hasil pertama adalah null, maka Oracle mengonversi nilai yang dikembalikan ke tipe data VARCHAR2 .
Dalam kasus Anda, hasil pertama adalah NULL, yang diperlakukan Oracle sebagai VARCHAR2. Nilai pengembalian Anda secara implisit dikonversi ke VARCHAR2. Jika Anda mengubah DECODE()
ke berikut ini Anda akan mendapatkan nomor:
select decode(1, 0, 0, 0.75)
dan Anda dapat mencapai NULL Anda dengan menggunakan NULLIF()
fungsi:
select nullif(decode(1, 0, 0, 0.75), 0) ...
Lebih baik menggunakan pernyataan CASE, yang memaksa bahwa semua tipe data yang dikembalikan adalah sama:
select case 1 when 0 then null
else 0.75
end ...
1. yang juga membuat saya ketahuan.