Listado completo de tutoriales
111 - Lenguaje de control de flujo (if) |
Existen palabras especiales que pertenecen al lenguaje de control de flujo que controlan la ejecución de las sentencias, los bloques de sentencias y procedimientos almacenados.
Tales palabras son: begin... end, goto, if... else, return, waitfor, while, break y continue.
- "begin... end" encierran un bloque de sentencias para que sean tratados como unidad.
- "if... else": testean una condición; se emplean cuando un bloque de sentencias debe ser ejecutado si una condición se cumple y si no se cumple, se debe ejecutar otro bloque de sentencias diferente.
- "while": ejecuta repetidamente una instrucción siempre que la condición sea verdadera.
- "break" y "continue": controlan la operación de las instrucciones incluidas en el bucle "while".
Veamos un ejemplo. Tenemos nuestra tabla "libros"; queremos mostrar todos los títulos de los cuales no hay libros disponibles (cantidad=0), si no hay, mostrar un mensaje indicando tal situación:
if exists (select * from libros where cantidad=0) (select titulo from libros where cantidad=0) else select 'No hay libros sin stock';
SQL Server ejecuta la sentencia (en este caso, una subconsulta) luego del "if" si la condición es verdadera; si es falsa, ejecuta la sentencia del "else" (si existe).
Podemos emplear "if...else" en actualizaciones. Por ejemplo, queremos hacer un descuento en el precio, del 10% a todos los libros de una determinada editorial; si no hay, mostrar un mensaje:
if exists (select * from libros where editorial='Emece') begin update libros set precio=precio-(precio*0.1) where editorial='Emece' select 'libros actualizados' end else select 'no hay registros actualizados';
Note que si la condición es verdadera, se deben ejecutar 2 sentencias. Por lo tanto, se deben encerrar en un bloque "begin...end".
En el siguiente ejemplo eliminamos los libros cuya cantidad es cero; si no hay, mostramos un mensaje:
if exists (select * from libros where cantidad=0) delete from libros where cantidad=0 else select 'No hay registros eliminados;
Dentro de los comandos SQL select, update y delete no podemos hacer uso de la sentencia de control de flujo if, debemos utilizar la sentencia case que vimos en el concepto anterior.
A partir de la versión 2012 de SQL Server disponemos de la función integrada iif:
select titulo,costo=iif(precio<38,'barato','caro') from libros;
Ingresemos el siguiente lote de comandos en el SQL Server Management Studio:
if object_id('libros') is not null
drop table libros;
create table libros(
codigo int identity,
titulo varchar(40) not null,
autor varchar(30),
editorial varchar(20),
precio decimal(5,2),
cantidad tinyint,
primary key (codigo)
);
go
insert into libros values('Uno','Richard Bach','Planeta',15,100);
insert into libros values('El aleph','Borges','Emece',20,150);
insert into libros values('Aprenda PHP','Mario Molina','Nuevo siglo',50,200);
insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll','Emece',15,0);
insert into libros values('Java en 10 minutos','Mario Molina','Emece',40,200);
-- Mostramos los títulos de los cuales no hay libros disponibles (cantidad=0);
-- en caso que no haya, mostramos un mensaje:
if exists (select * from libros where cantidad=0)
(select titulo from libros where cantidad=0)
else
select 'No hay libros sin stock';
-- Hacemos un descuento del 10% a todos los libros de editorial "Emece";
-- si no hay, mostramos un mensaje:
if exists (select * from libros where editorial='Emece')
begin
update libros set precio=precio-(precio*0.1) where editorial='Emece'
select 'libros actualizados'
end
else
select 'no hay registros actualizados';
-- Veamos si se actualizaron:
select * from libros where editorial='Emece';
-- Eliminamos los libros de los cuales no hay stock (cantidad=0);
-- si no hay, mostramos un mensaje:
if exists (select * from libros where cantidad=0)
delete from libros where cantidad=0
else
select 'No hay registros eliminados';
-- Ejecutamos nuevamente la sentencia anterior (Ahora se ejecuta la sentencia
-- del "else" porque no hay registros que cumplieran la condición.):
if exists (select * from libros where cantidad=0)
delete from libros where cantidad=0
else
select 'No hay registros eliminados';
select titulo,costo=iif(precio<38,'barato','caro') from libros;