Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

No es NULL pero es nulo!?¡¿

Estas en el tema de No es NULL pero es nulo!?¡¿ en el foro de Oracle en Foros del Web. Tengo una pequeña duda y me gustaría que alguien me aclarara un concepto... Al ejecutar la siguiente select: SELECT U.ID_USER FROM MICRO.TBL_USER U WHERE U.USERNAME ...
  #1 (permalink)  
Antiguo 04/09/2006, 06:46
Avatar de MACGREGOR  
Fecha de Ingreso: enero-2005
Mensajes: 89
Antigüedad: 19 años, 10 meses
Puntos: 0
No es NULL pero es nulo!?¡¿

Tengo una pequeña duda y me gustaría que alguien me aclarara un concepto...
Al ejecutar la siguiente select:

SELECT U.ID_USER FROM MICRO.TBL_USER U WHERE U.USERNAME = 'MACGREGOR'

Si el usuario existe me devuelve el identificador, pero si no existe no devuelve nada. Cuando digo nada me refiero a que no devuelve NULL, devuelve nada de nada! :(

Pensaba que retornaba NULL de manera que he utilizado esa consulta dentro de la siguiente:

SELECT CASE WHEN S.ID_USER IS NOT NULL THEN 0 ELSE (SELECT MAX(U.ID_USER)+1 FROM MICRO.TBL_USER U) END
FROM (SELECT U.ID_USER FROM MICRO.TBL_USER U WHERE U.USERNAME = 'MACGREGOR')S

La idea es que retorne 0 si el nombre de usuario existe o el primer identificador libre para añadir un nuevo usuario... Si el usuario existe retorna 0 si no existe, no retorna nada :(

Yo programo en Perl para conectar con Oracle, y puedo solucionar el problema lanzando dos consultas y controlando desde Perl lo que me devuelve Oracle, pero gastaría más recursos y sería más lento...

Además me corroe la curiosidad de saber que pasa y porque!

Alguien me puede hechar una mano?? Gracias.
  #2 (permalink)  
Antiguo 04/09/2006, 07:30
Avatar de MACGREGOR  
Fecha de Ingreso: enero-2005
Mensajes: 89
Antigüedad: 19 años, 10 meses
Puntos: 0
También he provado la siguiente consulta pero obtengo un resultado "vacío" si el usuario no existe.

SELECT NVL(S.ID_USER,(SELECT MAX(U.ID_USER)+1 FROM MICRO.TBL_USER U))
FROM (SELECT U.ID_USER FROM MICRO.TBL_USER U WHERE U.USERNAME = 'MACGREGOR')S
  #3 (permalink)  
Antiguo 04/09/2006, 07:50
Avatar de MACGREGOR  
Fecha de Ingreso: enero-2005
Mensajes: 89
Antigüedad: 19 años, 10 meses
Puntos: 0
Al final hice otra consulta SQL para obtener lo que buscaba, pero sigo estando muy interesado en saber que devuelve oracle en casos como los que he puesto antes.

Espero que alguien lo sepa para quitarme de encima esa duda.
Como dice un amigo mio... Lo que más me pudre es no saber el porqué!

Esta es la consulta que he hecho al final (por si le interesa a alguien )

SELECT DISTINCT
CASE WHEN (SELECT COUNT(*) FROM MICRO.TBL_USER U
WHERE U.USERNAME = 'MACGREGOR')=0
THEN (SELECT MAX(U.ID_USER)+1 FROM MICRO.TBL_USER U)
ELSE 0
END
FROM MICRO.TBL_USER U

gracias de antemano
  #4 (permalink)  
Antiguo 15/09/2006, 04:21
Avatar de Worp9975  
Fecha de Ingreso: mayo-2006
Ubicación: LV-426
Mensajes: 203
Antigüedad: 18 años, 5 meses
Puntos: 1
A ver si tu tiras una consulta en una tabla que no tiene filas Oracle devuelve NULL ; pero no te dice NULL , sencillamente no sale nada. Si él te devolviese la cadena NULL el usuario podría interpretar el campo en esa fila contiene la cadena NULL . Si no te devuelve nada es que te devuelve NULL.

Por ejemplo:

te creas esta tabla que inicialmente no contiene información.
Código PHP:
CREATE TABLE tabla1 COL1 VARCHAR2(100) ) ; 
tiras una select para sacar lo que tiene desde SQLPLUS por ejemplo
Código PHP:
SELECT FROM tabla1 
COMMIT WORK 
ahora inserta un registro con la palabra NULL
Código PHP:
INSERT INTO tabla1 VALUES ('NULL'); 
y vuelve a tirar la select
Código PHP:
SELECT FROM tabla1 
En definitiva , si no hay nada en ese campo Oracle te devuelve NULL osea nada. otra cosa es como Perl te devuelve y trata los NULLs. Pero desde SQLPLUS funciona así.

SAlu2
__________________
Time is the fire in which we burn
  #5 (permalink)  
Antiguo 15/09/2006, 08:06
Avatar de charlytesis  
Fecha de Ingreso: agosto-2003
Ubicación: La Paz - Bolivia
Mensajes: 207
Antigüedad: 21 años, 2 meses
Puntos: 1
Macgregor, el punto es el siguiente, nosotros pensamos que siempre algun valor que no retorna es NULL, pero no es asi, existen dos tipos de respuestas diferentes, uno que es justamente el NULL, y otro que es VACIO, si vacio, ya que no existen datos, y NULL es cuando si existiera el dato entre comillas, pero no nos sirve, hay un poco de complicaciòn en esto al principio pero con la practica se aprende.
__________________

Saludos desde el corazón de América.....BOLIVIA
Da lo mejor de ti, que siempre será recompensado


  #6 (permalink)  
Antiguo 18/09/2006, 08:59
Avatar de MACGREGOR  
Fecha de Ingreso: enero-2005
Mensajes: 89
Antigüedad: 19 años, 10 meses
Puntos: 0
Gracias por vuestras respuestas.
Entiendo que un campo pueda ser nulo (NULL) y que si se realiza una consulta o función sobre un campo nulo el resultado puede ser también NULL.
Pero creo que es como si existiera otro tipo de valor "NULL" aplicable a lo que puede retornarte una función o una subconsulta.
Después de mi experiencia (y de buscar en san google) lo denominaré NO_ROWS. (ya que he visto en varios sitios referencias a no_rows selected)

Ahora me gustaría saber como controlar este resultado, hay alguna variable especial que se pueda utilizar dentro de una consulta SQL? o en programación PL/SQL??

Nuevamente gracias.
  #7 (permalink)  
Antiguo 18/09/2006, 09:39
Avatar de charlytesis  
Fecha de Ingreso: agosto-2003
Ubicación: La Paz - Bolivia
Mensajes: 207
Antigüedad: 21 años, 2 meses
Puntos: 1
Bueno, cuando haces una una consulta para ver si es NULL o no generalamente haces llo siguiente:

SELECT *
FROM EMPLEADOS
WHERE NOMBRE IS NULL

en el otro caso es muy parecido con la pequeña diferencia que :

SELECT *
FROM EMPLEADOS
WHERE NOMBRE=''

prueba, espero te sirva, saludos....
__________________

Saludos desde el corazón de América.....BOLIVIA
Da lo mejor de ti, que siempre será recompensado


  #8 (permalink)  
Antiguo 18/09/2006, 15:28
Avatar de Worp9975  
Fecha de Ingreso: mayo-2006
Ubicación: LV-426
Mensajes: 203
Antigüedad: 18 años, 5 meses
Puntos: 1
Cita:
Iniciado por MACGREGOR Ver Mensaje
Gracias por vuestras respuestas.
Entiendo que un campo pueda ser nulo (NULL) y que si se realiza una consulta o función sobre un campo nulo el resultado puede ser también NULL.
Pero creo que es como si existiera otro tipo de valor "NULL" aplicable a lo que puede retornarte una función o una subconsulta.
Después de mi experiencia (y de buscar en san google) lo denominaré NO_ROWS. (ya que he visto en varios sitios referencias a no_rows selected)

Ahora me gustaría saber como controlar este resultado, hay alguna variable especial que se pueda utilizar dentro de una consulta SQL? o en programación PL/SQL??

Nuevamente gracias.
Si pero se utiliza en procedimientos almacenados. El nombre de la variable se llaman %SQLROWCOUNT

Por ejemplo

Código PHP:
CREATE OR REPLACE PROCEDURE prueba_select 
IS

BEGIN

   insert into emp 
      select 
from emp where empno 988899  ;


   if 
sql%rowcount 0 then
      dbms_output
.put_line ('No se insertaron filas') ;
   else
      
dbms_output.put_line('Insertadas '|| sql%rowcount ||' filas en emp');
   
end if ;


END 
Pero no las puedes usar fuera del PL/SQL de Oracle , osea java por ejemplo.
__________________
Time is the fire in which we burn
  #9 (permalink)  
Antiguo 20/09/2006, 08:46
Avatar de diegopedro  
Fecha de Ingreso: agosto-2006
Ubicación: Santiago
Mensajes: 120
Antigüedad: 18 años, 3 meses
Puntos: 0
MACGREGOR

Hace poco tuve algo parecido.

Migre de unix-oracle 8i a mierdasoft(microsoft)-oracle 10i

una de mis tablas clientes contenia 150 registros

Realice un select * from cliente where nombre is null
y me aparecia 15 registros viendo bien el la tabla existian mas campos vacios.

Analice bien la situacion y me encontre caracteres escondidos espacios ; etc que mierdasoft y oracle no los interpretaron.

Revisa en los campos nulos caracteres ocultos????
  #10 (permalink)  
Antiguo 20/09/2006, 08:47
Avatar de diegopedro  
Fecha de Ingreso: agosto-2006
Ubicación: Santiago
Mensajes: 120
Antigüedad: 18 años, 3 meses
Puntos: 0
MACGREGOR

Hace poco tuve algo parecido.

Migre de unix-oracle 8i a mierdasoft(microsoft)-oracle 10i

una de mis tablas clientes contenia 150 registros

Realice un select * from cliente where nombre is null
y me aparecia 15 registros viendo bien el la tabla existian mas campos vacios.

Analice bien la situacion y me encontre caracteres escondidos espacios ; etc que mierdasoft y oracle no los interpretaron.

Revisa en los campos nulos caracteres ocultos????
  #11 (permalink)  
Antiguo 20/09/2006, 09:24
Avatar de PequeñoMauro  
Fecha de Ingreso: abril-2006
Ubicación: Lima - Perú
Mensajes: 600
Antigüedad: 18 años, 7 meses
Puntos: 3
Ni bien tenga algún caracter escondido, ya sea un espacio o lo que sea, deja de ser NULL.
__________________
"Nada en mis manos traigo tan solo a tu cruz me aferro....."
  #12 (permalink)  
Antiguo 21/09/2006, 07:09
Avatar de diegopedro  
Fecha de Ingreso: agosto-2006
Ubicación: Santiago
Mensajes: 120
Antigüedad: 18 años, 3 meses
Puntos: 0
S

Cita:
Iniciado por PequeñoMauro Ver Mensaje
Ni bien tenga algún caracter escondido, ya sea un espacio o lo que sea, deja de ser NULL.

Estoy de acuerdo, pero cuando muestras esa informacion en un reporte el cliente no ve nada. De que me sirve hacer un select * from tabla where campo is null si el resultante no es que yo requiero.

Tengo que limpiar la tabla con esos caracteres escondidos, para que la informacion sea fidedigna y no entregar algo erroneo.


Atte
  #13 (permalink)  
Antiguo 09/01/2008, 07:45
Avatar de DeYoN  
Fecha de Ingreso: febrero-2004
Mensajes: 81
Antigüedad: 20 años, 9 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
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:24.