Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Dlaczego DECODE Oracle daje mi inną wartość niż NVL?

Dzieje się tak, ponieważ 3 parametr instrukcji decode to NULL; zgodnie z dokumentacją (moje podkreślenie).

Oracle automatycznie konwertuje wyrażenie i każdą wartość wyszukiwania na typ danych pierwszej wartości wyszukiwania przed porównaniem .... Jeśli pierwszy wynik ma typ danych CHAR lub jeśli pierwszy wynik jest pusty, Oracle konwertuje wartość zwracaną na typ danych VARCHAR2 .

W twoim przypadku pierwszym wynikiem jest NULL, który Oracle traktuje jako VARCHAR2. Twoja wartość zwracana jest niejawnie konwertowana na VARCHAR2. Jeśli zmieniłeś DECODE() do następujących otrzymasz numer:

select decode(1, 0, 0, 0.75)

i możesz osiągnąć NULL, używając NULLIF() funkcja:

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

Lepiej jest użyć instrukcji CASE, która wymusza, by wszystkie zwracane typy danych były takie same:

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

1. na co też mnie przyłapano.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Poprawka:„wiodąca precyzja interwału jest zbyt mała” w Oracle Database

  2. Wstawianie do tabeli zagnieżdżonej Oracle w Javie

  3. Czy Oracle używa oceny zwarciowej?

  4. java.lang.ClassCastException:oracle.sql.TIMESTAMP nie może być rzutowany na java.sql.Timestamp

  5. ROWIDTOCHAR() Funkcja w Oracle