sql >> Databasteknik >  >> RDS >> Oracle

Varför ger Oracles DECODE mig ett annat värde än NVL?

Det beror på att parametern 3 i din decode-sats är NULL; enligt dokumentationen (min betoning).

Oracle konverterar automatiskt expr och varje sökvärde till datatypen för det första sökvärdet innan det jämförs .... Om det första resultatet har datatypen CHAR eller om det första resultatet är null, konverterar Oracle returvärdet till datatypen VARCHAR2 .

I ditt fall är det första resultatet NULL, som Oracle behandlar som en VARCHAR2. Ditt returvärde konverteras implicit till en VARCHAR2. Om du ändrade din DECODE() till följande får du ett nummer:

select decode(1, 0, 0, 0.75)

och du kan uppnå din NULL genom att använda NULLIF() funktion:

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

Det är bättre att använda en CASE-sats, som tvingar fram att alla returnerade datatyper är desamma:

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

1. som jag också har fastnat för.



  1. Återställ en kopia av din databas

  2. Vad är det snabbaste sättet att beräkna medianen?

  3. Sätt att veta hur man hanterar databaskorruption i SQL Server

  4. SQL LocalDB vs SQL Server CE