Oracle
 sql >> Database >  >> RDS >> Oracle

Perché DECODE di Oracle mi dà un valore diverso da NVL?

È perché il parametro 3 della tua istruzione di decodifica è NULL; come da documentazione (corsivo mio).

Oracle converte automaticamente expr e ogni valore di ricerca nel tipo di dati del primo valore di ricerca prima del confronto .... Se il primo risultato ha il tipo di dati CHAR o se il primo risultato è null, Oracle converte il valore restituito nel tipo di dati VARCHAR2 .

Nel tuo caso il primo risultato è NULL, che Oracle tratta come VARCHAR2. Il tuo valore restituito viene convertito implicitamente in un VARCHAR2. Se hai cambiato il tuo DECODE() al seguente otterresti un numero:

select decode(1, 0, 0, 0.75)

e potresti ottenere il tuo NULL usando il NULLIF() funzione:

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

È meglio utilizzare un'istruzione CASE, che impone che tutti i tipi di dati restituiti siano gli stessi:

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

1. di cui sono stato catturato anch'io.