Control de flujo
Función : IF
Sintaxis :
IF ( condicion,expresion,expresion)
Descripción :
Es una función a la cual se le envían 3 argumentos: el segundo y tercer argumento corresponden a los valores que retornará en caso que el primer argumento (una expresión de comparación) sea "verdadero" o "falso"; es decir, si el primer argumento es verdadero, retorna el segundo argumento, sino retorna el tercero.
Ejemplo :
ENUNCIADO : Muestra los empleados que ganen mas de 9000 , cuyo retorno sea 'Verdadero' y 'Falso'.
SOLUCION :
SELECT FIRST_NAME , LAST_NAME , SALARY ,
IF (SALARY>9000,'Verdadero','Falso')
FROM EMPLOYEES LIMIT 10;
RESULTADO :
+------------+-----------+--------+--------------------------------------+
| FIRST_NAME | LAST_NAME | SALARY | if (SALARY>9000,'Verdadero','Falso') |
+------------+-----------+--------+--------------------------------------+
| Steven | King | 24000 | Verdadero |
| Neena | Kochhar | 17000 | Verdadero |
| Lex | De Haan | 17000 | Verdadero |
| Alexander | Hunold | 9000 | Falso |
| Bruce | Ernst | 6000 | Falso |
| David | Austin | 4800 | Falso |
| Valli | Pataballa | 4800 | Falso |
| Diana | Lorentz | 4200 | Falso |
| Nancy | Greenberg | 12000 | Verdadero |
| Daniel | Faviet | 9000 | Falso |
+------------+-----------+--------+--------------------------------------+
10 rows in set (0.02 sec)
ACLARACION :
Al usar la funcion IF , se crea un campo cuyo nombre es la condicion que hayamos puesto ,en este caso :
" IF (SALARY>9000 , 'Verdadero','Falso') ".
Este nuevo campo, contendra la palabra 'Verdadero' si su sueldo es mayor de 9000 y 'Falso' si es menor.
A continuación , se mostraran los campos elegidos y además se añadirá el nuevo campo con los resultados
definidos por la condicion('Verdadero o Falso').
Función : CASE
Sintaxis:
OPCION 1 :
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE
OPCION 2 :
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE
Descripción :
La función "case" es similar a la función "IF" (tambien es similar al Switch de .Net), sólo que se pueden establecer varias condiciones a cumplir.
Por cada valor hay un "when" y un "then"; si encuentra un valor coincidente en algún "when" ejecuta el "then" correspondiente a ese "when",
si no encuentra ninguna coincidencia,se ejecuta el "else", si no hay parte "else" retorna "null".Finalmente se coloca "end" para indicar
que el "case" ha finalizado.
IMPORTANTE:Como vemos en la sintaxis , existe una pequeña variación dependiendo de la condicion que queramos implementar en el WHEN-THEN , en caso de querer cumplir una condicion especifica como (WHEN SALARY<5000 THEN 'Poco') , debemos usar la opcion 2 , en la cual no se especifica el campo tras el CASE , ya que este esta incluido en la condicion. La Opcion 1 necesita especificar el campo y luego las condiciones que se aplicarán sobre él.
Ejemplo 1 :
ENUNCIADO 1 : Muestra todos los empleados que trabajen en "IT_PROG" como "JOB_PROGRAMADOR" , puedes
nombrar como "OTROS" a los que no cumplan esta condicion.
SOLUCION 1 :
SELECT FIRST_NAME , LAST_NAME ,
CASE JOB_ID
WHEN "IT_PROG" THEN "JOB_PROGRAMADOR"
ELSE "OTRO" END
FROM EMPLOYEES LIMIT 10;
RESULTADO 1 :
+------------+-----------+-------------------------------------------------------------------+
| FIRST_NAME | LAST_NAME | CASE JOB_ID WHEN "IT_PROG" THEN "JOB_PROGRAMADOR" ELSE "OTRO" END |
+------------+-----------+-------------------------------------------------------------------+
| Steven | King | OTRO |
| Neena | Kochhar | OTRO |
| Lex | De Haan | OTRO |
| Alexander | Hunold | JOB_PROGRAMADOR |
| Bruce | Ernst | JOB_PROGRAMADOR |
| David | Austin | JOB_PROGRAMADOR |
| Valli | Pataballa | JOB_PROGRAMADOR |
| Diana | Lorentz | JOB_PROGRAMADOR |
| Nancy | Greenberg | OTRO |
| Daniel | Faviet | OTRO |
+------------+-----------+-------------------------------------------------------------------+
10 rows in set (0.04 sec)
ACLARACION 1 :
Primero elegimos la funcion CASE , seguido del campo que queremos usar.
Seguidamente escribimos WHEN y la condicionque se debe cumplir y THEN que contendrá el texto a mostrar
si se cumple dicha condicion.
Podemos usar tantos WHEN - THEN como queramos , y para terminar podemos añadir , opcionalmente , un ELSE
y un nombre (si se deja en blanco se mostrara como NULL).
Finalizamos con END y el FROM de la tabla que estamos usando.
Ejemplo 2 :
ENUNCIADO 2 : Mostrar los empleados que ganan menos de 10000 como 'sueldo bajo' , los de mas de 18000
como 'Jefazo'.Los que no cumplan esta condicion puedes dejar como NULL o añadir 'Otros' opcionalmente.
SOLUCION 2:
SELECT FIRST_NAME,LAST_NAME,SALARY,
CASE
WHEN SALARY<10000 THEN 'Sueldo bajo'
WHEN SALARY>18000 THEN 'Jefazo'
ELSE 'OTRO' END
FROM EMPLOYEES LIMIT 10;
RESULTADO 2:
+------------+-----------+--------+--------------------------------------------------------------------+
| FIRST_NAME | LAST_NAME | SALARY | CASE WHEN SALARY<10000 THEN 'Sueldo bajo' WHEN SALARY> ...... |
+------------+-----------+--------+--------------------------------------------------------------------+
| Steven | King | 24000 | Jefazo |
| Neena | Kochhar | 17000 | OTRO |
| Lex | De Haan | 17000 | OTRO |
| Alexander | Hunold | 9000 | Sueldo bajo |
| Bruce | Ernst | 6000 | Sueldo bajo |
| David | Austin | 4800 | Sueldo bajo |
| Valli | Pataballa | 4800 | Sueldo bajo |
| Diana | Lorentz | 4200 | Sueldo bajo |
| Nancy | Greenberg | 12000 | OTRO |
| Daniel | Faviet | 9000 | Sueldo bajo |
+------------+-----------+--------+--------------------------------------------------------------------+
10 rows in set (0.00 sec)
ACLARACION 2:
Este ejercicio es igual que el anterior , usaremos la opcion CASE , pero no indicaremos campo alguno.
La variación está en que usaremos una condicion de busqueda , para ello usaremos WHEN seguido de la
condicion y su correspondiente THEN , que devolverá un resultado.
Al igual que en el otro caso , podemos usar tantos WHEN-THEN como queramos y la instrucción terminará
cuando coloquemos END.
FUNCION : IFNULL
Sintaxis :
IFNULL(expr1,expr2)
Descripción :
Si expr1 no es NULL, IFNULL() retorna expr1, de otro modo retorna expr2. IFNULL() retorna un valor numérico o de cadena de caracteres, en función del contexto en que se usa.
El valor por defecto de retorno de IFNULL(expr1,expr2) es el más “general” de las dos expresiones, en el orden STRING, REAL, o INTEGER. Considere el caso de una tabla basada en expresiones o donde MySQL debe almacenar internamente un valor retornado por IFNULL() en una tabla temporal.
Ejemplo :
ENUNCIADO : Muestra los empleados que no tienen comision como "SIN COMISION"
SOLUCION :
SELECT FIRST_NAME , LAST_NAME , COMMISSION_PCT ,
IFNULL(COMMISSION_PCT,'SIN COMISION')
FROM EMPLOYEES LIMIT 10;
RESULTADO :
+------------+-----------+----------------+---------------------------------------+
| FIRST_NAME | LAST_NAME | COMMISSION_PCT | IFNULL(COMMISSION_PCT,'SIN COMISION') |
+------------+-----------+----------------+---------------------------------------+
| Steven | King | NULL | SIN COMISION |
| Neena | Kochhar | NULL | SIN COMISION |
| Lex | De Haan | NULL | SIN COMISION |
| Alexander | Hunold | NULL | SIN COMISION |
| Bruce | Ernst | NULL | SIN COMISION |
| David | Austin | NULL | SIN COMISION |
| Valli | Pataballa | NULL | SIN COMISION |
| Diana | Lorentz | NULL | SIN COMISION |
| Nancy | Greenberg | NULL | SIN COMISION |
| Daniel | Faviet | NULL | SIN COMISION |
+------------+-----------+----------------+---------------------------------------+
10 rows in set (0.02 sec)
ACLARACION :
Con la funcion Ifnull podemos seleccionar el campo que queremos usar y la expresion/valor
(campo,'expresion/valor') que sustituira a los que cumplan la condicion NULL por 'SIN COMISION'.
FUNCION : NULLIF
Sintaxis :
NULLIF(expr1,expr2)
Descripción :
Retorna NULL si expr1 = expr2 es cierto, de otro modo retorna expr1. Es lo mismo que CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END.
Ejemplo :
ENUNCIADO : Muestra como NULL , los empleados que tengan un salary de 9000 **:**
SOLUCION :
SELECT FIRST_NAME , LAST_NAME , SALARY ,
NULLIF (SALARY , 9000)
FROM EMPLOYEES LIMIT 10;
RESULTADO :
+------------+-----------+--------+-----------------------+
| FIRST_NAME | LAST_NAME | SALARY | nullif(SALARY , 9000) |
+------------+-----------+--------+-----------------------+
| Steven | King | 24000 | 24000 |
| Neena | Kochhar | 17000 | 17000 |
| Lex | De Haan | 17000 | 17000 |
| Alexander | Hunold | 9000 | NULL |
| Bruce | Ernst | 6000 | 6000 |
| David | Austin | 4800 | 4800 |
| Valli | Pataballa | 4800 | 4800 |
| Diana | Lorentz | 4200 | 4200 |
| Nancy | Greenberg | 12000 | 12000 |
| Daniel | Faviet | 9000 | NULL |
+------------+-----------+--------+-----------------------+
10 rows in set (0.03 sec)
ACLARACION :
Con la funcion Nullif podemos seleccionar el campo que queremos usar y la expresion/valor
(campo,'expresion/valor') , al cumplirse se mostrara como NULL en el nuevo campo.