sábado, 2 de diciembre de 2023

Optimizar consulta sql en case Oracle

Tengo una consulta donde compara un valor de la tabla parametros con otro valor de otra tabla que se llama complemento_pago, pero hay un problema que hice dicha consulta y me sugirieron que la hiciera mas optima por ejm haciendo: And Serie = (select case ...... ) en meter los case al select del param 336 pero no entiendo como va la sintaxis, este es mi consulta:


SELECT cta_que_factura, tipo_documento,id_estatus, uuid, FECHA_CREACION, NOM_SISTEMA, serie

            from complemento_pago

            where TO_DATE(FECHA_CREACION, 'DD/MM/RRRR') =  TO_DATE(sysdate, 'DD/MM/RRRR')-(select valor from parametros where ID_PARAMETRO =334)

            and nom_sistema = Upper((select valor from parametros where id_parametro =335))  -- -> apartir de aqui abajo se debe de hacer la optimizacion 

             and serie = case WHEN (SELECT valor FROM parametros where id_parametro =336)= '1' then 'PA'

                                         else case WHEN (SELECT valor FROM parametros where id_parametro =336)= '2' then 'PB'

                                    else case WHEN (SELECT valor FROM parametros where id_parametro =336)= '3' then 'PC'

                                            else case WHEN (SELECT valor FROM parametros where id_parametro =336)= '4' then 'PD'

                                                else case WHEN (SELECT valor FROM parametros where id_parametro =336)= '5' then 'PE'

                                                    else case WHEN (SELECT valor FROM parametros where id_parametro =336)= '6' then 'PF'

                                                        else case WHEN (SELECT valor FROM parametros where id_parametro =336)= '7' then 'PG'

                                                            else case WHEN (SELECT valor FROM parametros where id_parametro =336)= '8' then 'PH'

                                                                else case WHEN (SELECT valor FROM parametros where id_parametro =336)= '9' then 'PI'

                                                                end

                                                            end

                                                        end

                                                    end

                                                end

                                            end

                                        end

                                    end

                            end;


Podrían por favor ayudarme en como podría cambiarla en como me sugirieron, la verdad soy muy nuevo en esto de sql de este nivel un tanto avanzado, si algo no me di a entender diganmelo por favor ycon gusto les aclararé sus dudas, saludos y quedo al pendiente de sus comentarios.


Solucion: 


1- Podrías hacer un procedimiento almacenado, guardar el valor del select valor en una variable y validarlo. 


2- Para comenzar, no necesitas utilizar tantas sentencias case, lo cual viene de que introduces una clausula else cuando no es necesaria.


La primera simplificación puede ser:


SELECT   cta_que_factura

       , tipo_documento,id_estatus

       , uuid

       , FECHA_CREACION

       , NOM_SISTEMA

       , serie

  from complemento_pago

 where TO_DATE(FECHA_CREACION, 'DD/MM/RRRR') =  TO_DATE(sysdate, 'DD/MM/RRRR')-(select valor from parametros where ID_PARAMETRO =334)

   and nom_sistema = Upper((select valor from parametros where id_parametro =335))  -- -> apartir de aqui abajo se debe de hacer la optimizacion

   and serie = case

                 WHEN (SELECT valor FROM parametros where id_parametro =336)= '1' then 'PA'

                 WHEN (SELECT valor FROM parametros where id_parametro =336)= '2' then 'PB'

                 WHEN (SELECT valor FROM parametros where id_parametro =336)= '3' then 'PC'

                 WHEN (SELECT valor FROM parametros where id_parametro =336)= '4' then 'PD'

                 WHEN (SELECT valor FROM parametros where id_parametro =336)= '5' then 'PE'

                 WHEN (SELECT valor FROM parametros where id_parametro =336)= '6' then 'PF'

                 WHEN (SELECT valor FROM parametros where id_parametro =336)= '7' then 'PG'

                 WHEN (SELECT valor FROM parametros where id_parametro =336)= '8' then 'PH'

                 WHEN (SELECT valor FROM parametros where id_parametro =336)= '9' then 'PI'

               end


Esto ya hace la sentencia mucho más legible.


Lo siguiente que me viene a la mente, es lanzar una sola vez la consulta de la tabla de parámetros, lo cual debiera estar soportado en la sintaxis, pero no tengo oracle a mano para comprobarlo:


SELECT   cta_que_factura

       , tipo_documento,id_estatus

       , uuid

       , FECHA_CREACION

       , NOM_SISTEMA

       , serie

  from complemento_pago

 where TO_DATE(FECHA_CREACION, 'DD/MM/RRRR') =  TO_DATE(sysdate, 'DD/MM/RRRR')-(select valor from parametros where ID_PARAMETRO =334)

   and nom_sistema = Upper((select valor from parametros where id_parametro =335))  -- -> apartir de aqui abajo se debe de hacer la optimizacion

   and serie = case (SELECT valor FROM parametros where id_parametro =336)

                 WHEN '1' then 'PA'

                 WHEN '2' then 'PB'

                 WHEN '3' then 'PC'

                 WHEN '4' then 'PD'

                 WHEN '5' then 'PE'

                 WHEN '6' then 'PF'

                 WHEN '7' then 'PG'

                 WHEN '8' then 'PH'

                 WHEN '9' then 'PI'

               end


Esta anterior es mi recomendación, pero no puedo dejar de mencionar que también podrías utilizar una función decode() en lugar del case


SELECT   cta_que_factura

       , tipo_documento,id_estatus

       , uuid

       , FECHA_CREACION

       , NOM_SISTEMA

       , serie

  from complemento_pago

 where TO_DATE(FECHA_CREACION, 'DD/MM/RRRR') =  TO_DATE(sysdate, 'DD/MM/RRRR')-(select valor from parametros where ID_PARAMETRO =334)

   and nom_sistema = Upper((select valor from parametros where id_parametro =335))  -- -> apartir de aqui abajo se debe de hacer la optimizacion

   and serie = decode((SELECT valor FROM parametros where id_parametro =336), '1', 'PA', '2', 'PB', '3', 'PC', '4', 'PD', '5', 'PE', '6', 'PF', '7', 'PG', '8', 'PH', '9', 'PI')



Fuentes.

Artículo: "Optimizar consulta sql en case Oracle" Publicado en https://es.stackoverflow.com/  el 30/08/2020. Consultado el 17/11/2023.

URL: https://es.stackoverflow.com/questions/385988/optimizar-consulta-sql-en-case-oracle


No hay comentarios:

Publicar un comentario