miércoles, 15 de enero de 2014

NULLIF

Probé este ejemplo en Oracle 11.2.0.2.7. Se puede comparer dos valores con NULLIF. Si son iguales, Oracle responde con un nulo.
 
SQL> select nvl(nullif(1,1),999) from dual
  2  /
 
NVL(NULLIF(1,1),999)
--------------------
                 999
 
SQL>
 
Si son diferentes, Oracle responde con el primer valor:
 
SQL> select nullif(1,2) from dual
  2  /
 
NULLIF(1,2)
-----------
          1
 
SQL>
 
También se puede hacerlo con una cadena de caracteres:
 
SQL> select nvl(nullif('manzanas','manzanas'),'null')
  2  from dual
  3  /
 
NVL(NULLIF('MANZANAS','MANZANAS'),'NULL')
-----------------------------------------
null
 
SQL> select nullif('manzanas','naranjas') from dual
  2  /
 
NULLIF('MANZANAS','NARANJAS')
-----------------------------
manzanas
 
Se puede emplear NULLIF con columnas de una table o de una vista así:
 
SQL> select nullif(username,password) from dba_users
  2  where username = 'SYSTEM'
  3  /
 
NULLIF(USERNAME,PASSWORD)
------------------------------
SYSTEM
 
SQL>
 
En el ejemplo siguiente, he empleado NULLIF con una variable:
 
SQL> variable a1 number
SQL> begin
  2    select 13 into :a1 from dual;
  3  end;
  4  /
 
Procedimiento PL/SQL terminado correctamente.
 
SQL> select nullif(:a1,14) from dual
  2  /
 
NULLIF(:A1,14)
--------------
            13
 
SQL>
 
Si intentas a emplear NULLIF con valores de clases diferentes, Oracle contesta con un error ORA-00932 y un mensaje apropiado para la clase de cada valor:
 
SQL> select nullif(1,'manzanas') from dual
  2  /
select nullif(1,'manzanas') from dual
                *
ERROR en linea 1:
ORA-00932: tipos de dato inconsistentes: se esperaba
NUMBER se ha obtenido CHAR
 
SQL> select nullif('manzanas',1) from dual
  2  /
select nullif('manzanas',1) from dual
                         *
ERROR en linea 1:
ORA-00932: tipos de dato inconsistentes: se esperaba
CHAR se ha obtenido NUMBER
 
SQL>