sql >> Databáze >  >> RDS >> Oracle

Proč mi Oracle DECODE dává jinou hodnotu než NVL?

Je to proto, že parametr 3 vašeho příkazu dekódování je NULL; podle dokumentace (můj důraz).

Oracle před porovnáním automaticky převede výraz a každou hodnotu vyhledávání na datový typ první hodnoty vyhledávání .... Pokud má první výsledek datový typ CHAR nebo pokud je první výsledek null, pak Oracle převede návratovou hodnotu na datový typ VARCHAR2 .

Ve vašem případě je prvním výsledkem NULL, což Oracle považuje za VARCHAR2. Vaše vrácená hodnota se implicitně převádí na VARCHAR2. Pokud jste změnili DECODE() k následujícímu byste dostali číslo:

select decode(1, 0, 0, 0.75)

a můžete dosáhnout své NULL pomocí NULLIF() funkce:

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

Je lepší použít příkaz CASE, který vynucuje, aby všechny vrácené datové typy byly stejné:

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

1. na který jsem se taky chytil.



  1. AKTUALIZACE SQL pro začátečníky

  2. PLS-00103:Setkal se se symbolem CREATE

  3. Problém s pamětí SQLite s přístupem singleton

  4. PostgreSQL dotaz ILIKE s SQLAlchemy