Đó là vì tham số 3 của câu lệnh giải mã của bạn là NULL; theo tài liệu (nhấn mạnh của tôi).
Oracle tự động chuyển đổi expr và từng giá trị tìm kiếm thành kiểu dữ liệu của giá trị tìm kiếm đầu tiên trước khi so sánh .... Nếu kết quả đầu tiên có kiểu dữ liệu CHAR hoặc nếu kết quả đầu tiên là null, thì Oracle chuyển đổi giá trị trả về thành kiểu dữ liệu VARCHAR2 .
Trong trường hợp của bạn, kết quả đầu tiên là NULL, được Oracle coi là VARCHAR2. Giá trị trả về của bạn đang được chuyển đổi hoàn toàn thành VARCHAR2. Nếu bạn đã thay đổi DECODE()
của mình vào phần sau, bạn sẽ nhận được một số:
select decode(1, 0, 0, 0.75)
và bạn có thể đạt được NULL của mình bằng cách sử dụng NULLIF()
chức năng:
select nullif(decode(1, 0, 0, 0.75), 0) ...
Tốt hơn nên sử dụng câu lệnh CASE, câu lệnh này bắt buộc tất cả các kiểu dữ liệu trả về đều giống nhau:
select case 1 when 0 then null
else 0.75
end ...