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

Case en Oracle

Estas en el tema de Case en Oracle en el foro de Oracle en Foros del Web. Buenas Tengo un problemilla con un case, resulta que tengo tres campos varchar2 (campo1, campo2 y campo3) y este select: Código: SELECT CASE ( NVL ...
  #1 (permalink)  
Antiguo 24/08/2009, 01:05
 
Fecha de Ingreso: agosto-2009
Mensajes: 2
Antigüedad: 14 años, 8 meses
Puntos: 0
Case en Oracle

Buenas

Tengo un problemilla con un case, resulta que tengo tres campos varchar2 (campo1, campo2 y campo3) y este select:

Código:
SELECT CASE ( NVL (campo1, '') || NVL (campo2, '') || NVL (campo3, ''))
      WHEN '' 
            THEN
              'Vacío'
      ELSE
               'Lleno'
END as valor FROM TABLA
Resulta que en las filas que los tres campos están a NULL, no entra en 'Vacío' y si lo hace en 'Lleno'
Sin embargo entra en 'Vacío' si modifico la SQL de la siguiente forma:

Código:
SELECT CASE ( NVL (campo1, 'a') || NVL (campo2, 'b') || NVL (campo3, 'c'))
      WHEN 'abc' 
            THEN
              'Vacío'
      ELSE
               'Lleno'
END as valor FROM TABLA

¿Por qué sucede esto?

Última edición por w3ah; 24/08/2009 a las 01:50
  #2 (permalink)  
Antiguo 24/08/2009, 07:23
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Case en Oracle

Sin fundamentos teoricos establecidos, se podría explicar la similitud visual que tiene oracle para tratar los valores NULL.

si se hace un select *from tabla; para registros que tienen valores NULL, se ppuede observar que se muestra idéntico a una inserción de un '' (vacío).
Sin embargo, la solución al problema ya la encontraste y esa es la forma de evitar dicho problema.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 25/08/2009, 03:12
 
Fecha de Ingreso: agosto-2009
Mensajes: 2
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Case en Oracle

Gracias, supongo que no hay otra forma de solucionarlo, aunque sigo sin saber la lógica (si es que tiene) que se usa para esto, porque por mucha similitud visual que haya no es lo mismo NULL que '' (al menos en un case) ya que estas sentencias:

Código:
select case null when null then 'si' else 'no' end from dual;
Código:
select case '' when '' then 'si' else 'no' end from dual;
Código:
select case nvl(null,'') when '' then 'si' else 'no' end from dual;
Código:
select case nvl(NULL,'') when NULL then 'si' else 'no' end from dual;
..devuelven todas 'no'.
  #4 (permalink)  
Antiguo 25/08/2009, 04:18
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 6 meses
Puntos: 85
Respuesta: Case en Oracle

La eterna discusión sobre si '' representa lo mismo que null, cada motor de base de datos tiene su propia implementación, en el caso de Oracle lo son, y además null no es igual a null

Código:
system@10G> select * from dual where ''='';

ninguna fila seleccionada

Transcurrido: 00:00:00.03
system@10G> select * from dual where null = null;

ninguna fila seleccionada

Transcurrido: 00:00:00.00
system@10G> select * from dual where null is null;

D
-
X

Transcurrido: 00:00:00.00
system@10G> select * from dual where '' is null;

D
-
X

Transcurrido: 00:00:00.01
Saludos
  #5 (permalink)  
Antiguo 25/08/2009, 10:37
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Case en Oracle

que bien matanga.
Con esa prueba quedo totalmente convencido.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #6 (permalink)  
Antiguo 24/09/2009, 07:44
Avatar de acervantes  
Fecha de Ingreso: agosto-2003
Ubicación: Madrid
Mensajes: 311
Antigüedad: 20 años, 8 meses
Puntos: 1
Respuesta: Case en Oracle

en oracle ocurre esto:

DECODE null = null ---> (verdadero)
CASE null = null ---> null

Código PHP:
SELECT DECODE(NULL,
              
NULL'NULL Es Nulo'
             
'NULL No Es Nulo'
             
NULL_DECODE,
       CASE 
NULL 
            WHEN NULL THEN 
'NULL Es Nulo'
            
ELSE 'NULL No Es Nulo'
       
END NULL_CASE
  FROM DUAL

resultado:
Código PHP:
NULL_DECODE     NULL_CASE
------------    ---------------
NULL Es Nulo    NULL No Es Nulo 
__________________
ACervantes

[El éxito dura hasta que alguien las caga; los errores son eternos]
  #7 (permalink)  
Antiguo 25/09/2009, 04:01
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 6 meses
Puntos: 85
Respuesta: Case en Oracle

Por definición, en Oracle, NULL nunca es igual a NULL, solo la función DECODE tiene esa consideración, y está expresamente indicado en la documentación.

In a DECODE function, Oracle considers two nulls to be equivalent. If expr is null, then Oracle returns the result of the first search that is also null.

http://download.oracle.com/docs/cd/B...htm#SQLRF00631

Saludos
  #8 (permalink)  
Antiguo 26/10/2009, 12:42
Avatar de 8vio  
Fecha de Ingreso: marzo-2008
Ubicación: Detras del monitor
Mensajes: 168
Antigüedad: 16 años, 1 mes
Puntos: 6
Respuesta: Case en Oracle

Ojo esto funciona ¡¡¡¡¡

SELECT
CASE WHEN campo IS NULL THEN 'NO EXISTE'

ELSE

'EXISTE' END

FROM

TABLA
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 21:25.