Oracle - Necesito emular un IF en SQL, sin usar el CASE dado que la base es vieja

   
Vista:

Necesito emular un IF en SQL, sin usar el CASE dado que la base es vieja

Publicado por Lucas (1 intervención) el 04/09/2013 18:08:44
Como el titulo lo dice, necesito emular un IF en SQL sin usar el CASE, ya que la base en la que esta el sistema es vieja. dicho query se utilizara en un record_group para llamar una LOV en un forms. El problema se presenta ya que según el parámetro que llegue, el query debe incluir o excluir campos en la LOV. yo pensé agregándole una I (para incluir) y una E (para excluir).

select distinct tipo, b.nro_1, b.nro_2, b.nro_3, b.razon_social, b.estado, b.nro_instr, b.ejerc_instr,
decode (ret_si_cta_benef(b.id),1,' SI',' --') cta_bco , b.id
from co_beneficiarios b, co_benef_clases bc, ngr_clases_benef nc
where b.id = bc.id_benef AND
bc.id_clase = nc.id AND
(
(
(substr(:parameter.p_parametro3,1,1) = 'I' AND NC.clase IN ( rtrim(substr(:parameter.p_parametro3,2,5)),rtrim(substr(:parameter.p_parametro3,7,5)),
rtrim(substr(:parameter.p_parametro3,12,5)),rtrim(substr(:parameter.p_parametro3,17,5)),rtrim(substr(:parameter.p_parametro3,22,5)),
rtrim(substr(:parameter.p_parametro3,27,5))))
OR
(substr(:parameter.p_parametro3,1,1) = 'I' AND (substr(:parameter.p_parametro3,2,5) = 'TODOS'))
)
OR
(substr(:parameter.p_parametro3,1,1) = 'E' AND NC.clase NOT IN ( rtrim(substr(:parameter.p_parametro3,2,5)),
rtrim(substr(:parameter.p_parametro3,7,5)), rtrim(substr(:parameter.p_parametro3,12,5)),
rtrim(substr(:parameter.p_parametro3,17,5)),rtrim(substr(:parameter.p_parametro3,22,5)),
rtrim(substr(:parameter.p_parametro3,27,5))))
)
AND
b.nro_1 like :b_control_benef.ti_cuit1 and
(substr('00000000',1,8-length(b.nro_2))||b.nro_2 like substr('00000000',1,8-length(:b_control_benef.ti_cuit2))||:b_control_benef.ti_cuit2) and
b.nro_3 like :b_control_benef.ti_cuit3 and b.estado is null order by nro_1, nro_2, nro_3

funciona, pero al arrojar mas de un parámetro al forms, se enloquece trayéndome todo, haciendo caso omiso del filtrado
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Necesito emular un IF en SQL, sin usar el CASE dado que la base es vieja

Publicado por luis pablo (232 intervenciones) el 06/09/2013 21:09:35
Porque te complicas tanto para elaborar un LOV?? puedes crear varios LOV y condicionar su llamada desde el trigger de form donde es llamado.

Veo que tu sentencia select en la parte de las condiciones tiene muchas funciones, eso no es bueno ya que colocar de esa forma las funciones deshabilita los índices para la sentencia. Desde la elaboracion de la sentencia select ya está mal estructurada.

Verifica por favor el plan de ejecucion de esta sentencia select y que índices esta utilizando.

Tener una sentencia select tan compleja en un formulario es mucho mas "pesada" que tenerlo en una funcion de base de datos. Al elaborar Lovs estos deben ser simples ya que son solo Lista de Valores (codigo y descripción), tratar en la medida de lo posible de usar un select optimo y verificando que realmente use los indices y medir el tiempo de respuesta.

Ojalá haya aportado en algo

Saludos

Luis
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Necesito emular un IF en SQL, sin usar el CASE dado que la base es vieja

Publicado por Alixandro florian_do@yahoo.com (63 intervenciones) el 09/09/2013 17:16:24
Lucas, tal y como te comenta Luis Pablo, ese query no optimo y mucho menos para un Lov, además no creo que él se aloque, lo loco esta en tantas condiciones que ha querido ponerle, veo que tiene la clausula OR, recuerda que esta de cumple para una u otra condición o para ambas, tal vez ahí está lo loco del query, para estos casos es preferible hacer varios query unidos por la cláusula UNION o UNION ALL que uno tan complejo, además, no te complique en un campo de una forma puedes tener tantos lov puedas, claro está condicionado por algún parámetro y utilizando Set_Item_Property para indicar el que quiere lanzar en el momento.

Como nota1: el CASE no funciona a nivel de forma, si quieres usarlo, debes crearte un view o una función de BD.
Nota2: los query complejos es mejor tenerlo a nivel de BD que a nivel de forma, ya que a nivel de BD es más rápido, puesto que consume los recursos del servidor y no de la PC local.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar