Listado completo de tutoriales

29 - Búsqueda de patrones (like - not like)


Existe un operador relacional que se usa para realizar comparaciones exclusivamente de cadenas, "like" y "not like".

Hemos realizado consultas utilizando operadores relacionales para comparar cadenas. Por ejemplo, sabemos recuperar los libros cuyo autor sea igual a la cadena "Borges":

 select * from libros
  where autor='Borges';

El operador igual ("=") nos permite comparar cadenas de caracteres, pero al realizar la comparación, busca coincidencias de cadenas completas, realiza una búsqueda exacta.

Imaginemos que tenemos registrados estos 2 libros:

 "El Aleph", "Borges";
 "Antologia poetica", "J.L. Borges";

Si queremos recuperar todos los libros de "Borges" y especificamos la siguiente condición:

 select * from libros
 where autor='Borges';

sólo aparecerá el primer registro, ya que la cadena "Borges" no es igual a la cadena "J.L. Borges".

Esto sucede porque el operador "=" (igual), también el operador "<>" (distinto) comparan cadenas de caracteres completas. Para comparar porciones de cadenas utilizamos los operadores "like" y "not like".

Entonces, podemos comparar trozos de cadenas de caracteres para realizar consultas. Para recuperar todos los registros cuyo autor contenga la cadena "Borges" debemos tipear:

 select * from libros
  where autor like "%Borges%";

El símbolo "%" (porcentaje) reemplaza cualquier cantidad de caracteres (incluyendo ningún caracter). Es un caracter comodín. "like" y "not like" son operadores de comparación que señalan igualdad o diferencia.

Para seleccionar todos los libros que comiencen con "M":

 select * from libros
  where titulo like 'M%';

Note que el símbolo "%" ya no está al comienzo, con esto indicamos que el título debe tener como primera letra la "M" y luego, cualquier cantidad de caracteres.

Para seleccionar todos los libros que NO comiencen con "M":

 select * from libros
  where titulo not like 'M%';

Así como "%" reemplaza cualquier cantidad de caracteres, el guión bajo "_" reemplaza un caracter, es otro caracter comodín. Por ejemplo, queremos ver los libros de "Lewis Carroll" pero no recordamos si se escribe "Carroll" o "Carrolt", entonces tipeamos esta condición:

 select * from libros
  where autor like "%Carrol_";

"like" se emplea con tipos de datos char, varchar, date, time, timestamp. Si empleamos "like" con tipos de datos que no son caracteres utilizamos el comando 'cast' convirtiendo éste al tipo de dato. Por ejemplo, queremos buscar todos los libros cuyo precio se encuentre entre 10.00 y 19.99:

 select titulo,precio from libros
  where cast(precio as varchar) like '1_.%';

Queremos los libros que NO incluyen centavos en sus precios:

 select titulo,precio from libros
  where cast(precio as varchar) like '%.00';

Ingresemos el siguiente lote de comandos SQL en pgAdmin:

 drop table if exists libros;
 
 create table libros(
  codigo serial,
  titulo varchar(40) not null,
  autor varchar(20) default 'Desconocido',
  editorial varchar(20),
  precio decimal(6,2),
  primary key(codigo)
 );

 insert into libros(titulo,autor,editorial,precio)
  values('El aleph','Borges','Emece',15.90);
 insert into libros(titulo,autor,editorial,precio)
  values('Antología poética','J. L. Borges','Planeta',null);
 insert into libros(titulo,autor,editorial,precio)
  values('Alicia en el pais de las maravillas','Lewis Carroll',null,19.90);
 insert into libros(titulo,autor,editorial,precio)
  values('Matematica estas ahi','Paenza','Siglo XXI',15);
 insert into libros(titulo,autor,editorial,precio)
  values('Martin Fierro','Jose Hernandez',default,40);
 insert into libros(titulo,autor,editorial,precio)
  values('Aprenda PHP','Mario Molina','Nuevo siglo',56.50);

 -- Recuperamos todos los libros que contengan en el campo "autor" la cadena "Borges":
 select * from libros
  where autor like '%Borges%';

 -- Seleccionamos los libros cuyos títulos comienzan con la letra "M":
 select * from libros
  where titulo like 'M%';

 -- Seleccionamos todos los títulos que NO comienzan con "M":
 select * from libros
  where titulo not like 'M%';

 -- Si queremos ver los libros de "Lewis Carroll" pero no recordamos si se escribe "Carroll"
 -- o "Carrolt", podemos emplear el comodín "_" (guión bajo) y establecer la siguiente condición:
 select * from libros
  where autor like '%Carrol_';

 -- Recuperamos todos los libros cuyo precio se encuentra entre 10.00 y 19.99:
 select titulo,precio from libros
  where cast(precio as varchar) like '1_.%';

 -- Recuperamos los libros que NO incluyen centavos en sus precios:
 select titulo,precio from libros
  where cast(precio as varchar) like '%.00';

La ejecución de este lote de comandos SQL genera una salida similar a:

PostgreSQL pgAdmin like not like


Retornar