{"id":803,"date":"2021-05-31T20:24:00","date_gmt":"2021-06-01T00:54:00","guid":{"rendered":"http:\/\/gregorgonzalez.com.ve\/blog\/?p=803"},"modified":"2021-05-31T20:24:00","modified_gmt":"2021-06-01T00:54:00","slug":"usar-case-en-where-y-en-order-by-oracle","status":"publish","type":"post","link":"http:\/\/gregorgonzalez.com.ve\/blog\/usar-case-en-where-y-en-order-by-oracle\/","title":{"rendered":"Usar CASE en WHERE y en ORDER BY ORACLE"},"content":{"rendered":"<p>En alg\u00fan momento si necesitamos condicionar la informaci\u00f3n de un WHERE o un ORDER BY, se puede realizar sin inconvenientes con un simple case:<\/p>\n<p>Ejemplo de un CASE evaluando un solo campo:<\/p>\n<pre class=\"lang:plsql decode:true\">CASE campo\r\n    WHEN 'ACTIVO'\r\n    THEN\r\n        --SQL\r\n    WHEN 'INACTIVO'\r\n    THEN \r\n        --SQL\r\n    ELSE\r\n        --SQL\r\nEND<\/pre>\n<p>Ejemplo de un CASE si se necesita evaluar m\u00faltiples campos:<\/p>\n<pre class=\"lang:plsql decode:true\">CASE \r\n    WHEN campo1 = 'ACTIVO' AND campo2 = 'DISPONIBLE'\r\n    THEN\r\n        --SQL\r\n    WHEN campo1 = 'INACTIVO' AND campo2 = 'NO DISPONIBLE'\r\n    THEN \r\n        --SQL\r\n    ELSE\r\n        --SQL\r\nEND<\/pre>\n<p>Hay que conocer la diferencia de ambos m\u00e9todos para poder realizar condicionales dentro de cl\u00e1usulas WHERE y ORDER BY.<\/p>\n<p>&nbsp;<\/p>\n<h5>Ejemplo de CASE en WHERE.<\/h5>\n<p>En un caso con un Procedimiento PL\/SQL me encontr\u00e9 con una tabla que inclu\u00eda 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.<\/p>\n<p>Se indica que el tipo de documento puede ser \u00abNATURAL\u00bb o \u00abJURIDICO\u00bb y cargar\u00e1n la informaci\u00f3n de un PDF filtrando por una variable v_doc. Si es natural, solo debe cargar los \u00edtems del cliente natural, si es jur\u00eddico deb\u00eda cargar ambos porque necesitaba informaci\u00f3n que se compart\u00edan entre ellos.<\/p>\n<pre class=\"lang:plsql decode:true\">SELECT * FROM documento doc \r\nWHERE id_cliente = 1\r\nAND (CASE \r\n     WHEN v_doc = 'N' AND doc.tipo = 'NATURAL'\r\n     THEN \r\n        1\r\n     WHEN v_doc = 'J' \r\n     THEN \r\n        1\r\n    END) = 1<\/pre>\n<p>Establecemos que retorne el n\u00famero \u201c1\u201d cuando acierta la condici\u00f3n 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\u00f3n.<\/p>\n<p>Esto es para mantener el mismo est\u00e1ndar SQL con un query ya construido y no tener que crear el SQL con m\u00faltiples variables de textos y luego realizar un EXECUTE IMMEDIATE. Nos evitamos cambiar toda esa estructura.<\/p>\n<p>&nbsp;<\/p>\n<h5>Ejemplo de CASE en ORDER BY.<\/h5>\n<p>El mismo caso, si era un cliente natural deb\u00eda ordenar el documento por una columna de dicha tabla que solo aplica para documentos naturales y si era jur\u00eddico deb\u00eda ordenar por otra columna que era exclusivamente para documentos jur\u00eddicos.<\/p>\n<pre class=\"lang:plsql decode:true\">SELECT * FROM documento doc \r\n...\r\nORDER BY (\r\n    CASE v_doc\r\n        WHEN  'N'\r\n        THEN \r\n            doc.orden_natural\r\n        WHEN 'J' \r\n        THEN \r\n            doc.orden_juridico\r\n    END) ASC<\/pre>\n<p>Es sencillo en la parte de order by porque no necesit\u00e9 evaluar tantos campos, se puede llegar a complicar cuando debes agregar mas condiciones.<\/p>\n<p>Advierto que Oracle tiene sus limitaciones y debes realizarlo en las condiciones que te lo permita, cada versi\u00f3n es distinta y puede no reconocer la syntaxis.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En alg\u00fan momento si necesitamos condicionar la informaci\u00f3n de un WHERE o un ORDER BY, se puede realizar sin inconvenientes con un simple case: Ejemplo de un CASE evaluando un solo campo: CASE campo WHEN &#8216;ACTIVO&#8217; THEN &#8211;SQL WHEN &#8216;INACTIVO&#8217; THEN &#8211;SQL ELSE &#8211;SQL END Ejemplo de un CASE si se necesita evaluar m\u00faltiples campos: [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":660,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[239],"tags":[297,296],"_links":{"self":[{"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts\/803"}],"collection":[{"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/comments?post=803"}],"version-history":[{"count":2,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts\/803\/revisions"}],"predecessor-version":[{"id":805,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts\/803\/revisions\/805"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/media\/660"}],"wp:attachment":[{"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/media?parent=803"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/categories?post=803"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/tags?post=803"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}