Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Warum gibt mir DECODE von Oracle einen anderen Wert als NVL?

Das liegt daran, dass der 3. Parameter Ihrer Dekodierungsanweisung NULL ist; gemäß der Dokumentation (meine Betonung).

Oracle konvertiert expr und jeden Suchwert vor dem Vergleich automatisch in den Datentyp des ersten Suchwerts .... Hat das erste Ergebnis den Datentyp CHAR oder ist das erste Ergebnis null, so konvertiert Oracle den Rückgabewert in den Datentyp VARCHAR2 .

In Ihrem Fall ist das erste Ergebnis NULL, das Oracle als VARCHAR2 behandelt. Ihr Rückgabewert wird implizit in einen VARCHAR2 konvertiert. Wenn Sie Ihren DECODE() geändert haben zu folgendem würden Sie eine Nummer erhalten:

select decode(1, 0, 0, 0.75)

und Sie könnten Ihr NULL erreichen, indem Sie NULLIF() verwenden Funktion:

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

Es ist besser, eine CASE-Anweisung zu verwenden, die erzwingt, dass alle zurückgegebenen Datentypen gleich sind:

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

1. was mich auch erwischt hat.