Ver Mensaje Individual
  #13 (permalink)  
Antiguo 09/01/2008, 07:45
Avatar de DeYoN
DeYoN
 
Fecha de Ingreso: febrero-2004
Mensajes: 81
Antigüedad: 20 años, 3 meses
Puntos: 0
Re: No es NULL pero es nulo!?¡¿

Buenos días,

MACGREGOR, tiene toda la razón hay ocasiones en las que un select no devuelve nada (ojo ninguna fila no_rows) que es diferente de devolver un NULL.

Como ilustración el siguiente ejemplo:

Creamos una tabla:
Código PHP:
CREATE TABLE tabla1 COL1 VARCHAR2(100) ) ; 
Realizamos un select dando un valor por defecto si el campo es NULL
Código PHP:
SELECT NVL(col1,5FROM tabla1
Si lanzamos la consulta no obtenemos ningun resultado NO_ROWS, dado que la funcion nvl no funciona porque no se aplica sobre ningun campo ya que no se ha devuelto nada.

Así pues la SOLUCIÓN, y estoy orgulloso de ella por que la he pensado yo solito es obligar a que nos devuelva al menos una fila para que se pueda aplicar la funcion nvl sobre un campo null.

Para ello utilizamos la tabla dual cruzandola con un left join, que oracle quedaria de la siguiente manera:

Código PHP:
SELECT nvl(tabla1.COL15), dummy  FROM tabla1dual WHERE dual.dummy != tabla1.col1(+); 
De esta manera si la consulta no nos devuelve nada, obtendremos el valor por defecto 5.

Pero aun no no hemos terminado , ya que si insertamos un valor NULL dentro de TABLA1.COL1 no se cumpliria la condición "WHERE dual.dummy != tabla1.col1(+)" y perderiamos esa fila en la consulta.

Asi que un último paso:
Código PHP:
select nvl(tabla1.COL1,6), dummy  from tabla1dual WHERE dual.dummy != nvl(tabla1.col1(+),0); 
Y YA ESTA CASI TERMINADO! , no obstante hay que asegurarse que la clausula "dual.dummy != nvl(tabla1.col1(+),0);" se cumpla siempre para no perder ninguna columna, en este caso concreto si COL1 = 'X' perderiamos esa fila.

También podriamos usar nuestra propia tabla con un determinado valor (solo una fila) en lugar de usar la tabla dual, cada uno que le eche imaginación.

Espero que os pueda servir de ayuda, un Saludo,
Eduardo Antón.

Última edición por DeYoN; 09/01/2008 a las 11:22