LIKE (Transact-SQL)

Determina si una cadena de caracteres específica coincide con un patrón especificado. Un patrón puede contener caracteres normales y caracteres comodín. Durante la operación de búsqueda de coincidencias de patrón, los caracteres normales deben coincidir exactamente con los caracteres especificados en la cadena de caracteres. Sin embargo, los caracteres comodín pueden coincidir con fragmentos arbitrarios de la cadena. La utilización de caracteres comodín hace que el operador LIKE sea más flexible que los operadores de comparación de cadenas = y !=. Si alguno de los argumentos no es del tipo de datos de cadena de caracteres, el SQL Server 2005 Database Engine (Motor de base de datos de SQL Server 2005) lo convierte al tipo de datos de cadena de caracteres, si es posible.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]

Argumentos

match_expression

Es cualquier expresión válida de tipo de datos de caracteres.

pattern

Es la cadena de caracteres específica que se busca en match_expression, que puede incluir los siguientes caracteres comodín válidos. pattern puede tener 8.000 bytes como máximo.

Carácter comodín Descripción Ejemplo

%

Cualquier cadena de cero o más caracteres.

WHERE title LIKE '%computer%' busca todos los títulos de libros que contengan la palabra 'computer' en el título.

_ (carácter de subrayado)

Cualquier carácter.

WHERE au_fname LIKE ‘_ean’ busca todos los nombres de cuatro letras que terminen en ean (Dean, Sean, etc.)

[ ]

Cualquier carácter individual del intervalo ([a-f]) o del conjunto ([abcdef]) que se ha especificado.

WHERE au_lname LIKE ‘[C-P]arsen’ busca apellidos de autores que terminen en arsen y empiecen por cualquier carácter individual entre C y P, como Carsen, Larsen, Karsen, etc.

[^]

Cualquier carácter individual que no se encuentre en el intervalo ([^a-f]) o el conjunto ([^abcdef]) que se ha especificado.

WHERE au_lname LIKE ‘de[^l]%’ busca todos los apellidos de autores que empiecen por de y en los que la siguiente letra no sea l.

escape_character

Es un carácter que se coloca delante de un carácter comodín para indicar que el comodín no debe interpretarse como tal, sino como un carácter normal. escape_character es una expresión de caracteres que no tiene ningún valor predeterminado y se debe evaluar como un solo carácter.

Notas

Cuando se realizan comparaciones de cadenas con LIKE, todos los caracteres de la cadena patrón son significativos, incluso los espacios iniciales o finales. Si una comparación de una consulta debe devolver todas las filas con una cadena LIKE 'abc ' (abc seguido de un espacio), no se devolverán las filas en las que el valor de esa columna sea abc (sin espacio al final). Sin embargo, no se tienen en cuenta los espacios en blanco finales de la expresión con la que se compara el patrón. Si la comparación de una consulta debe devolver todas las filas con la cadena LIKE 'abc' (abc sin espacio), se devolverán todas las filas que empiecen por abc y tengan cero o más espacios al final.

Una comparación de cadenas donde se utilice un patrón que contenga datos de tipo char y varchar puede no pasar una comparación LIKE debido a la forma en que se han almacenado los datos. Es importante conocer el almacenamiento de cada tipo de datos y dónde puede generar errores una comparación LIKE. En el siguiente ejemplo se pasa una variable local char a un procedimiento almacenado y, a continuación, se utiliza la operación de búsqueda de coincidencias de patrón para encontrar todos los empleados cuyos apellidos empiecen por un juego de caracteres especificado.

USE AdventureWorks;
GO
CREATE PROCEDURE FindEmployee @EmpLName char(20)
AS
SELECT @EmpLName = RTRIM(@EmpLName) + '%';
SELECT c.FirstName, c.LastName, a.City
FROM Person.Contact c JOIN Person.Address a ON c.ContactID = a.AddressID
WHERE c.LastName LIKE @EmpLName;
GO
EXEC FindEmployee @EmpLName = 'Barb';
GO

En el procedimiento FindEmployee, no se devuelven filas porque la variable char (@EmpLName) contiene espacios al final cuando el nombre tiene menos de 20 caracteres. Debido a que la columna LastName es de tipo varchar, no hay espacios al final. Este procedimiento no funciona porque los espacios al final son significativos.

Sin embargo, el siguiente ejemplo funciona porque no se agregan espacios al final en la variable varchar:

USE AdventureWorks;
GO
CREATE PROCEDURE FindEmployee @EmpLName varchar(20)
AS
SELECT @EmpLName = RTRIM(@EmpLName) + '%';
SELECT c.FirstName, c.LastName, a.City
FROM Person.Contact c JOIN Person.Address a ON c.ContactID = a.AddressID
WHERE c.LastName LIKE @EmpLName;
GO
EXEC FindEmployee @EmpLName = 'Barb';

Éste es el conjunto de resultados. 

FirstName         LastName              City       
---------- ----------------------------------------
Angela             Barbariol            Snohomish
David              Barber               Snohomish

(2 row(s) affected)

Operación de búsqueda de coincidencias de patrón con LIKE

LIKE admite operaciones de búsqueda de coincidencias de patrón ASCII y Unicode. Cuando todos los argumentos (match_expression, pattern y escape_character, si están presentes) son tipos de datos de carácter ASCII, se realiza la operación de búsqueda de coincidencias de patrón ASCII. Si alguno de los argumentos es del tipo de datos Unicode, todos los argumentos se convierten a Unicode y se realiza la operación de búsqueda de coincidencias de patrón Unicode. Cuando se utilizan datos Unicode (tipos de datos nchar o nvarchar) con LIKE, los espacios en blanco al final son significativos; sin embargo, para los datos que no son Unicode, no lo son. El uso que se hace de LIKE con Unicode es compatible con el estándar SQL-92. El uso que se hace de LIKE con ASCII es compatible con las versiones anteriores de SQL Server.

A continuación se ofrece una serie de ejemplos donde se muestran las diferencias entre las filas devueltas tras la operación de búsqueda de coincidencias de patrón con LIKE para ASCII y Unicode.

-- ASCII pattern matching with char column
CREATE TABLE t (col1 char(30));
INSERT INTO t VALUES ('Robert King');
SELECT * 
FROM t 
WHERE col1 LIKE '% King'   -- returns 1 row

-- Unicode pattern matching with nchar column
CREATE TABLE t (col1 nchar(30));
INSERT INTO t VALUES ('Robert King');
SELECT * 
FROM t 
WHERE col1 LIKE '% King'   -- no rows returned

-- Unicode pattern matching with nchar column and RTRIM
CREATE TABLE t (col1 nchar (30));
INSERT INTO t VALUES ('Robert King');
SELECT * 
FROM t 
WHERE RTRIM(col1) LIKE '% King'   -- returns 1 row

[!NOTA] La intercalación influye en las comparaciones con LIKE. Para obtener más información, vea COLLATE (Transact-SQL).

Utilizar el carácter comodín %

Si se especifica el símbolo LIKE '5%', el Database Engine (Motor de base de datos) busca el número 5 seguido de cualquier cadena de cero o más caracteres.

Por ejemplo, la siguiente consulta muestra todas las vistas de administración dinámica de la base de datos AdventureWorks, porque todas empiezan por las letras dm.

USE AdventureWorks;
GO
SELECT Name
FROM sys.system_views
WHERE Name LIKE 'dm%';
GO

Para ver todos los objetos que no sean vistas de administración dinámica, utilice NOT LIKE 'dm%'. Si hay un total de 32 objetos y LIKE encuentra 13 nombres que coinciden con el patrón, NOT LIKE encuentra los 19 objetos que no coinciden con el patrón de LIKE.

Es posible que no siempre se encuentren los mismos nombres con un patrón como LIKE '[^d][^m]%'. En lugar de 19 nombres, puede que encuentre sólo 14, quedando eliminados de los resultados todos los nombres que empiecen por d o tengan m como segunda letra, y los nombres de las vistas de administración dinámica. Esto se debe a que las cadenas de comparación con caracteres comodín negativos se evalúan por pasos, un comodín cada vez. Si la coincidencia genera un error en algún momento de la evaluación, se elimina.

Utilizar caracteres comodín como literales

Los caracteres comodín que se utilizan en la operación de búsqueda de coincidencias de patrón se pueden utilizar como literales. Para utilizar un carácter comodín como literal, inclúyalo entre corchetes. La tabla siguiente muestra varios ejemplos del uso de la palabra clave LIKE y los caracteres comodín [ ].

Símbolo Significado

LIKE ‘5[%]’

5%

LIKE ‘[_]n’

_n

LIKE ‘[a-cdf]’

a, b, c, d o f

LIKE ‘[-acdf]’

-, a, c, d o f

LIKE ‘[ [ ]’

[

LIKE ']'

]

LIKE 'abc[_]d%'

abc_d y abc_de

LIKE 'abc[def]'

abcd, abce y abcf

Operación de búsqueda de coincidencias de patrón con la cláusula ESCAPE

Se pueden buscar cadenas de caracteres que incluyan uno o más caracteres comodín especiales. Por ejemplo, la tabla discounts de una base de datos customers puede almacenar valores de descuento que incluyan un signo de porcentaje (%). Para buscar el signo de porcentaje como carácter en lugar de como carácter comodín, deben suministrarse la palabra clave ESCAPE y el carácter de escape. Supongamos que una base de datos de ejemplo contiene una columna denominada comment que contiene el texto 30%. Para buscar las filas que contengan la cadena 30% en cualquier parte de la columna comment, especifique una cláusula WHERE como ésta: WHERE comment LIKE '%30!%%' ESCAPE '!'. Si no se especifican ESCAPE y el carácter de escape, el Database Engine (Motor de base de datos) devolverá las filas con la cadena 30.

Si no hay ningún carácter después de un carácter de escape en el patrón de LIKE, el patrón no es válido y LIKE devuelve FALSE. Si el carácter posterior a un carácter de escape no es un carácter comodín, el carácter de escape se descarta y el carácter que sigue al escape se trata como un carácter normal del patrón. Esto afecta a los caracteres comodín del signo de porcentaje (%), carácter de subrayado (_) y corchete de apertura ([) cuando se encuentran entre corchetes dobles ([ ]). Asimismo, dentro de corchetes dobles ([ ]) se pueden aplicar caracteres de escape al símbolo de intercalación (^), guión (-) y corchete de cierre (]).

Tipos de resultado

Boolean

Valor del resultado

LIKE devuelve TRUE si match_expression coincide con el valor especificado en pattern.

Ejemplos

A. Utilizar LIKE con el carácter comodín %

En el siguiente ejemplo se buscan todos los números de teléfono de la tabla Contact cuyo código de área sea 415.

USE AdventureWorks;
GO
SELECT FirstName, LastName, Phone
FROM Person.Contact
WHERE phone LIKE '415%'
ORDER by LastName;
GO

Éste es el conjunto de resultados. 

FirstName               LastName              phone
-----------------       ----------------      ------------
Ruben                   Alonso                415-555-0124
Shelby                  Cook                  415-555-0121
Karen                   Hu                    415-555-0114
John                    Long                  415-555-0147
David                   Long                  415-555-0123
Gilbert                 Ma                    415-555-0138
Meredith                Moreno                415-555-0131
Alexandra               Nelson                415-555-0174
Taylor                  Patterson             415-555-0170
Gabrielle               Russell               415-555-0197
Dalton                  Simmons               415-555-0115

(11 row(s) affected)

B. Utilizar NOT LIKE con el carácter comodín %

En el siguiente ejemplo se buscan todos los números de teléfono de la tabla Contact cuyos códigos de área no sean 415.

USE AdventureWorks;
GO
SELECT FirstName, LastName, Phone
FROM Person.Contact
WHERE Phone NOT LIKE '415%' AND FirstName = 'Gail'
ORDER BY LastName;
GO

Éste es el conjunto de resultados. 

FirstName              LastName         Phone
---------              ----------       -------------------
Gail                   Alexander        1 (11) 500 555-0120
Gail                   Butler           1 (11) 500 555-0191
Gail                   Erickson         834-555-0132
Gail                   Erickson         849-555-0139
Gail                   Griffin          450-555-0171
Gail                   Moore            155-555-0169
Gail                   Russell          334-555-0170
Gail                   Westover         305-555-0100

(8 row(s) affected)

C. Utilizar la cláusula ESCAPE

En el ejemplo siguiente se utiliza la cláusula ESCAPE y el carácter de escape para buscar exactamente la cadena de caracteres 10-15% en la columna c1 de la tabla mytbl2.

USE tempdb;
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'mytbl2')
   DROP TABLE mytbl2;
GO
USE tempdb;
GO
CREATE TABLE mytbl2
(
 c1 sysname
);
GO
INSERT mytbl2 VALUES ('Discount is 10-15% off');
INSERT mytbl2 VALUES ('Discount is .10-.15 off');
GO
SELECT c1 
FROM mytbl2
WHERE c1 LIKE '%10-15!% off%' ESCAPE '!';
GO

D. Utilizar los caracteres comodín [ ]

En el siguiente ejemplo se buscan Contacts cuyo nombre sea Cheryl o Sheryl.

USE AdventureWorks;
GO
SELECT ContactID, FirstName, LastName 
FROM Person.Contact 
WHERE FirstName LIKE '[CS]heryl';
GO

En el siguiente ejemplo se buscan las filas de Contacts con el apellido Zheng o Zhang.

USE AdventureWorks;
GO
SELECT LastName, FirstName, Phone
FROM Person.Contact
WHERE LastName LIKE 'Zh[ae]ng'
ORDER BY LastName ASC, FirstName ASC;
GO

Vea también

Referencia

Expresiones (Transact-SQL)
Funciones (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)

Ayuda e información

Obtener ayuda sobre SQL Server 2005