Usar CASE en WHERE y en ORDER BY ORACLE


En algún momento si necesitamos condicionar la información de un WHERE o un ORDER BY, se puede realizar sin inconvenientes con un simple case:

Ejemplo de un CASE evaluando un solo campo:

Ejemplo de un CASE si se necesita evaluar múltiples campos:

Hay que conocer la diferencia de ambos métodos para poder realizar condicionales dentro de cláusulas WHERE y ORDER BY.

 

Ejemplo de CASE en WHERE.

En un caso con un Procedimiento PL/SQL me encontré con una tabla que incluía dos tipos de documentos, para no repetir el mismo procedimiento o realizar dos consultas dependiendo del tipo de documento, me prepuse usar la misma consulta, pero filtrando por el tipo de documento.

Se indica que el tipo de documento puede ser «NATURAL» o «JURIDICO» y cargarán la información de un PDF filtrando por una variable v_doc. Si es natural, solo debe cargar los ítems del cliente natural, si es jurídico debía cargar ambos porque necesitaba información que se compartían entre ellos.

Establecemos que retorne el número “1” cuando acierta la condición dentro del CASE y por fuera evaluamos que aplique dentro del WHERE = 1, ya que no evaluamos los campos directamente sino el resultado de la condición.

Esto es para mantener el mismo estándar SQL con un query ya construido y no tener que crear el SQL con múltiples variables de textos y luego realizar un EXECUTE IMMEDIATE. Nos evitamos cambiar toda esa estructura.

 

Ejemplo de CASE en ORDER BY.

El mismo caso, si era un cliente natural debía ordenar el documento por una columna de dicha tabla que solo aplica para documentos naturales y si era jurídico debía ordenar por otra columna que era exclusivamente para documentos jurídicos.

Es sencillo en la parte de order by porque no necesité evaluar tantos campos, se puede llegar a complicar cuando debes agregar mas condiciones.

Advierto que Oracle tiene sus limitaciones y debes realizarlo en las condiciones que te lo permita, cada versión es distinta y puede no reconocer la syntaxis.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *