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

problemas con el case

Estas en el tema de problemas con el case en el foro de Oracle en Foros del Web. Hola tengo una duda a la hora de usar el if cuando consulto una bd de oracle digamos que tengo una tabla en la cual ...
  #1 (permalink)  
Antiguo 04/11/2008, 05:16
 
Fecha de Ingreso: septiembre-2008
Mensajes: 70
Antigüedad: 16 años, 2 meses
Puntos: 0
De acuerdo problemas con el case

Hola tengo una duda a la hora de usar el if cuando consulto una bd de oracle digamos que tengo una tabla en la cual el tipo de precio me lo indican estos campos.

Si factor1 = ‘1’
Per ruptura

sino
Si factor2 = ‘1’
per previsió

sino
Si factor3 = ‘1’
Per rotació
Sino
Per ruptura

esto lo soluciono haciendo la consulta y luego en una aplicacion en c++ preguntando por el valor de los campos, ahora mi enorme duda es. con una herramientas de consulta directas a la BBDD (en mi caso SQL Developer)
puedo hacer una consulta con algo similar a un if, es que he probado con la sentencia case pero como son campos diferentes no veo manera de ocnjugarlos existe alguna manera ?

Gracias
  #2 (permalink)  
Antiguo 04/11/2008, 08:50
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Respuesta: problemas con el case

Utiliza el DECODE :

select decode(factor1 , '1','Per ruptura',
decode(factor2 , '2','per previsió',
decode(factor3 , '3','per rotació','Per ruptura')))
from dual
  #3 (permalink)  
Antiguo 05/11/2008, 10:39
 
Fecha de Ingreso: septiembre-2008
Mensajes: 70
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: problemas con el case

exelente respuesta te dejo un saludo y el karma
  #4 (permalink)  
Antiguo 18/11/2008, 16:35
 
Fecha de Ingreso: marzo-2008
Ubicación: Euskadi
Mensajes: 64
Antigüedad: 16 años, 8 meses
Puntos: 0
Respuesta: problemas con el case

Hola,

aunque la solución de jc3000 es válida, una opción mucho más limpia y flexible es la utilización de CASE WHEN ... THEN .... WHEN ... THEN ... ELSE ... END.

La consulta sería algo así (no la he probado):

Código:
SELECT CASE WHEN factor1 = ‘1’ THEN 'Per ruptura' 
            WHEN factor2 = ‘1’ THEN 'per previsió' 
            WHEN factor3 = ‘1’ THEN 'Per rotació' 
            ELSE 'Per ruptura' END 
FROM tabla;
Un saludo.
  #5 (permalink)  
Antiguo 19/11/2008, 04:16
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Respuesta: problemas con el case

Si, estoy de acuerdo, en estos caso es mucho mas facil de interpretar el CASE ya que con el DECODE uno se puede liar con tanto parentesis y demas.

Estuve probando el CASE antes de poner el decode y no acertaba con la sintaxis correcta. Hace mucho tiempo que no tiro código y a veces me cuesta recordar las cosas.

Gracias por el aporte
  #6 (permalink)  
Antiguo 19/11/2008, 04:57
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años, 1 mes
Puntos: 85
Respuesta: problemas con el case

El tema es interesante, pero primero que nada comentar algo sobre el decode, y es que acepta hasta 255 parametros, por lo tanto no hay que anidarlo 3 veces.

Código:
select 
decode(factor1 , 
'1','Per ruptura',
'2','per previsió',
'3','per rotació',
'Per ruptura')
from dual
El case nace para reemplazar el decode, por lo tanto, es de esperar que evoluciones en futuras versiones, cosa que no va a pasar con del decode, de momento las ventajas que se pueden apreciar son, es ANSI y es fácil de comprender, dado que existe en la mayoría de motores, es decir, que todavía es relativo y a gusto de cada uno.

Nosotros utilizamos mucho el case por tener sistemas que deben funcionar tanto en Oracle como en Sql Server y así la traducción de codigo es más directa.

Saludos
  #7 (permalink)  
Antiguo 19/11/2008, 05:23
 
Fecha de Ingreso: marzo-2008
Ubicación: Euskadi
Mensajes: 64
Antigüedad: 16 años, 8 meses
Puntos: 0
Respuesta: problemas con el case

Hola matanga,

fíjate en que no se evalua un solo campo sino 3 (factor1, factor2 y factor3) con lo cual esa última decode no es válida.

El decode está bien para casos muy sencillos pero para evaluaciones más complejas, comparar distintos campos, filtrar por rangos (podemos utilizar BETWEEN, < y >), etc. habría que utilizar CASE.

De hecho me parece una herramienta tan potente que muchas consultas se pueden optimizar mucho gracias al CASE. Me explico: ¿quién no ha hecho alguna vez una 'superconsulta' con UNION ó UNION ALL donde las consultas son práctimente iguales salvo algún filtro? Pues con el CASE podemos hacer una única consulta tomando el filtro menos restrictivo que abarque los registros de todas ellas (para eso tienen que ser parecidas, claro) y luego filtrar los datos en diferentes campos con el CASE. Espero haberme explicado.

Un saludo.
  #8 (permalink)  
Antiguo 19/11/2008, 08:40
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años, 1 mes
Puntos: 85
Respuesta: problemas con el case

Cita:
fíjate en que no se evalua un solo campo sino 3 (factor1, factor2 y factor3) con lo cual esa última decode no es válida.
Tendré que volver al oculista

Saludos
  #9 (permalink)  
Antiguo 20/11/2008, 02:15
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Respuesta: problemas con el case

je je je je
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 06:00.