Listado completo de tutoriales

71 - Función de control if con varias tablas.


Ver video

Podemos emplear "if" y "case" en la misma sentencia que usamos un "join".

Por ejemplo, tenemos las tablas "libros" y "editoriales" y queremos saber si hay libros de cada una de las editoriales:

 select e.nombre,
  if (count(l.codigoeditorial)>0,'Si','No') as hay
  from editoriales as e
  left join libros as l
  on e.codigo=l.codigoeditorial
  group by e.nombre;

Podemos obtener una salida similar usando "case" en lugar de "if":

 select e.nombre,
  case count(l.codigoeditorial)
   when 0 then 'No'
   else 'Si' end as 'Hay'
  from editoriales as e
  left join libros as l
  on e.codigo=l.codigoeditorial
  group by e.nombre;

Servidor de MySQL instalado en forma local.

Ingresemos al programa "Workbench" y ejecutemos el siguiente bloque de instrucciones SQL:

 drop table if exists libros, editoriales;

 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40) not null,
  autor varchar(30) not null default 1,
  codigoeditorial tinyint unsigned not null,
  precio decimal(5,2) unsigned,
  primary key (codigo)
 );
 
 create table editoriales ( 
  codigo tinyint unsigned auto_increment,
  nombre varchar(20),
  primary key (codigo) 
 );

 insert into editoriales (nombre) values ('Planeta');
 insert into editoriales (nombre) values ('Emece');
 insert into editoriales (nombre) values ('Paidos');


 insert into libros (titulo, autor,codigoeditorial,precio)
  values('Alicia en el pais de las maravillas','Lewis Carroll',1,23.5);
 insert into libros (titulo, autor,codigoeditorial,precio)
  values('Alicia a traves del espejo','Lewis Carroll',2,25);
 insert into libros (titulo, autor,codigoeditorial,precio) 
  values('El aleph','Borges',2,15);
 insert into libros (titulo, autor,codigoeditorial,precio)
  values('Matemática estas ahi','Paenza',1,10);

 -- Queremos saber si hay libros de cada una de las editoriales,
 -- necesitamos consultar ambas tablas:
 select e.nombre,
  if (count(l.codigoeditorial)>0,'Si','No') as hay
  from editoriales as e
  left join libros as l
  on e.codigo=l.codigoeditorial
  group by e.nombre;

 -- Podemos obtener una salida similar usando "case" en lugar de "if":
 select e.nombre,
  case count(l.codigoeditorial)
   when 0 then 'No'
   else 'Si' end as 'Hay'
  from editoriales as e
  left join libros as l
  on e.codigo=l.codigoeditorial
  group by e.nombre;

Genera una salida similar a esta:

MySQL join if case

Retornar