Ver Mensaje Individual
  #2 (permalink)  
Antiguo 06/12/2016, 15:26
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: condicional if en consulta select sql?

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
  1. mysql> SELECT * FROM tabla;
  2. +------+----------------+-------------+
  3. | id   | estado_detalle | descripcion |
  4. +------+----------------+-------------+
  5. |    1 |              1 | uno         |
  6. |    1 |              1 | one         |
  7. |    2 |              1 | dos         |
  8. |    2 |              0 | two         |
  9. |    3 |              0 | tres        |
  10. +------+----------------+-------------+
  11. 5 rows in set (0.00 sec)

Si quisiéramos obtener los registros con estado_detalle = 1 entonces harías algo así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla
  2.     -> WHERE
  3.     ->   estado_detalle = 1;
  4. +------+----------------+-------------+
  5. | id   | estado_detalle | descripcion |
  6. +------+----------------+-------------+
  7. |    1 |              1 | uno         |
  8. |    1 |              1 | one         |
  9. |    2 |              1 | dos         |
  10. +------+----------------+-------------+
  11. 3 rows in set (0.00 sec)

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
  1. mysql> SELECT * FROM tabla
  2.     -> WHERE
  3.     ->   estado_detalle = 1
  4.     -> UNION
  5.     -> SELECT * FROM tabla
  6.     -> WHERE
  7.     ->   NOT EXISTS ( SELECT * FROM tabla T1
  8.     ->                WHERE
  9.     ->                  tabla.id = T1.id
  10.     ->                  AND t1.estado_detalle = 1)
  11.     ->   AND estado_detalle = 0;
  12.  
  13. +------+----------------+-------------+
  14. | id   | estado_detalle | descripcion |
  15. +------+----------------+-------------+
  16. |    1 |              1 | uno         |
  17. |    1 |              1 | one         |
  18. |    2 |              1 | dos         |
  19. |    3 |              0 | tres        |
  20. +------+----------------+-------------+
  21. 4 rows in set (0.00 sec)

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.