Oracle
 sql >> база данни >  >> RDS >> Oracle

Защо DECODE на Oracle ми дава различна стойност от NVL?

Това е, защото параметърът 3 на вашия израз за декодиране е NULL; според документацията (подчертавам).

Oracle автоматично преобразува expr и всяка стойност за търсене в типа данни на първата стойност за търсене, преди да сравни .... Ако първият резултат има тип данни CHAR или ако първият резултат е нулев, тогава Oracle преобразува върнатата стойност в типа данни VARCHAR2 .

Във вашия случай първият резултат е NULL, който Oracle третира като VARCHAR2. Вашата върната стойност се преобразува имплицитно в VARCHAR2. Ако сте променили своя DECODE() до следното ще получите номер:

select decode(1, 0, 0, 0.75)

и бихте могли да постигнете своя NULL, като използвате NULLIF() функция:

select nullif(decode(1, 0, 0, 0.75), 0) ...

По-добре е да използвате израз CASE, който налага всички върнати типове данни да са еднакви:

select case 1 when 0 then null
              else 0.75
       end ...

1. за което и аз бях хванат.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да конфигурирате Glassfish Server в Eclipse ръчно

  2. Нулирайте последователност според годината, а не с минимална или максимална стойност

  3. Разделяне на низ, разделен със запетая, в съхранена в PL/SQL процедура

  4. 40 въпрос, който трябва да знаете за R12.2

  5. Получаване на ORA-03115:неподдържан мрежов тип данни или грешка при представяне при извличане на масив от varchar от анонимен pl/sql