Hola juaarias:
Hay algunas formas para hacer lo que pides, pero creo que más que "optimizar" las cosas, en realidad las complicarías más.
Te comento que las sentencias condicionales tipo IF o CASE en realidad no están pensadas originalmente para SQL, sino que vienen precisamente de los lenguajes de programación, de tal suelte que por lo general tienen mejor rendimiento que hacer consultas complejas.
Ahora bien, a modo de cultura general y de que tengas posibilidad de probar una alternativa, te comento que podrías utilizar UNION's para hacer más o menos lo que quieres. Veamos este ejemplo:
Supongamos que tienes esta tabla:
Código MySQL:
Ver original+------+----------------+-------------+
| id | estado_detalle | descripcion |
+------+----------------+-------------+
| 1 | 1 | uno |
| 1 | 1 | one |
| 2 | 1 | dos |
| 2 | 0 | two |
| 3 | 0 | tres |
+------+----------------+-------------+
Si quisiéramos obtener los registros con estado_detalle = 1 entonces harías algo así:
Código MySQL:
Ver original -> estado_detalle = 1;
+------+----------------+-------------+
| id | estado_detalle | descripcion |
+------+----------------+-------------+
| 1 | 1 | uno |
| 1 | 1 | one |
| 2 | 1 | dos |
+------+----------------+-------------+
Observa que el id=3 no aparece porque no tienen ningún estado_detalle = 1. Si quisieras en estos casos mostrar por default los registros con estado = 0, podrías hacerlo con UNION's y subconsultas, así:
Código MySQL:
Ver original -> estado_detalle = 1
-> tabla.id = T1.id
-> AND t1.estado_detalle
= 1) -> AND estado_detalle
= 0;
+------+----------------+-------------+
| id | estado_detalle | descripcion |
+------+----------------+-------------+
| 1 | 1 | uno |
| 1 | 1 | one |
| 2 | 1 | dos |
| 3 | 0 | tres |
+------+----------------+-------------+
Observa que en la segunda subconsulta, lo primero que haces es verificar con el NOT EXISTS que no haya ningún registro con estado = 1 para el id respectivo.
Difícilmente esto será más eficiente que utilizar un simple IF de programación, pero bueno, haz la prueba y nos comentas.
Saludos
Leo.