sql >> Database >  >> RDS >> Oracle

Waarom geeft Oracle's DECODE mij een andere waarde dan NVL?

Het is omdat de 3-parameter van je decodeerinstructie NULL is; volgens de documentatie (mijn nadruk).

Oracle converteert expr en elke zoekwaarde automatisch naar het gegevenstype van de eerste zoekwaarde alvorens te vergelijken .... Als het eerste resultaat het gegevenstype CHAR heeft of als het eerste resultaat null is, converteert Oracle de geretourneerde waarde naar het gegevenstype VARCHAR2 .

In uw geval is het eerste resultaat NULL, dat door Oracle wordt behandeld als een VARCHAR2. Uw retourwaarde wordt impliciet geconverteerd naar een VARCHAR2. Als u uw DECODE() . heeft gewijzigd naar het volgende zou je een nummer krijgen:

select decode(1, 0, 0, 0.75)

en je zou je NULL kunnen bereiken door de NULLIF() . te gebruiken functie:

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

Het is beter om een ​​CASE-instructie te gebruiken, die afdwingt dat alle geretourneerde datatypes hetzelfde zijn:

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

1. waar ik ook op ben betrapt.



  1. Een lijst met database-e-mailprofielen retourneren in SQL Server (T-SQL)

  2. Postgres-dump laden nadat docker heeft samengesteld

  3. Het Smart Home-gegevensmodel

  4. INSERT gebruiken met een PostgreSQL-database met Python