Partilhar via


LIKE (Transact-SQL)

Determina se uma cadeia de caracteres específica corresponde a um padrão especificado. Um padrão pode incluir caracteres normais e curingas. Durante a correspondência de padrões, os caracteres normais devem corresponder exatamente aos caracteres especificados na cadeia de caracteres. Entretanto, os caracteres curinga podem ser correspondidos a fragmentos arbitrários da cadeia de caracteres. O uso de caracteres curinga torna o operador LIKE mais flexível que o uso dos operadores de comparação de cadeias de caracteres = e !=. Se qualquer um dos argumentos não for do tipo de dados de cadeia de caracteres, o Mecanismo de Banco de Dados do SQL Server o converterá no tipo de dados de cadeia de caracteres, se possível.

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]

Argumentos

  • match_expression
    É qualquer expressão válida do tipo de dados de caractere.

  • pattern
    É a cadeia de caracteres específica a ser procurada na match_expression, podendo incluir os caracteres curinga válidos a seguir. pattern pode ter no máximo 8.000 bytes.

    Caractere curinga

    Descrição

    Exemplo

    %

    Qualquer cadeia de zero ou mais caracteres.

    WHERE title LIKE '%computer%' localiza todos os títulos de livro com a palavra 'computer' em qualquer lugar no título do livro.

    _ (sublinhado)

    Qualquer caractere único.

    WHERE au_fname LIKE '_ean' localiza todos os nomes de quatro letras que terminam com ean (Dean, Sean e assim por diante).

    [ ]

    Qualquer caractere único no intervalo ([a-f]) ou conjunto ([abcdef]) especificado.

    WHERE au_lname LIKE '[C-P]arsen' localiza os sobrenomes de autores que terminem com arsen e que comecem com qualquer caractere único entre C e P, por exemplo, Carsen, Larsen, Karsen e assim por diante. Em pesquisas de intervalo, os caracteres incluídos no intervalo podem variar de acordo com as regras de classificação do agrupamento.

    [^]

    Qualquer caractere único que não esteja no intervalo (^[a-f]) ou conjunto ([^abcdef]) especificado.

    WHERE au_lname LIKE 'de[^l]%' localiza todos os sobrenomes de autor que comecem com de e a letra seguinte não seja l.

  • escape_character
    É um caractere que é colocado na frente de um caractere curinga para indicar que o curinga deve ser interpretado como um caractere comum, e não como um curinga. escape_character é uma expressão de caracteres que não tem padrão e deve ser avaliada para somente um caractere.

Tipos de resultado

Boolean

Valor do resultado

LIKE retornará TRUE se a match_expression corresponder ao patternespecificado.

Comentários

Ao executar comparações de cadeias de caracteres usando LIKE, todos os caracteres na cadeia padrão são significativos. Isso inclui espaços à esquerda ou à direita. Se uma comparação em uma consulta deve retornar todas as linhas com uma cadeia de caracteres LIKE 'abc ' (abc seguido de um único espaço), não será retornada nenhuma linha na qual o valor daquela coluna seja abc (abc sem espaço). Entretanto, os espaços em branco à direita da expressão cujo padrão é correspondido são ignorados. Se uma comparação em uma consulta deve retornar todas as linhas com a cadeia de caracteres LIKE 'abc' (abc sem espaço), serão retornadas todas as linhas que comecem com abc e que tenham zero ou mais espaços em branco à direita.

Uma comparação de cadeia de caracteres que use um padrão que contenha dados char e varchar pode não passar em uma comparação LIKE devido à maneira que os dados estão armazenados. Você deve entender o armazenamento de cada tipo de dados e onde uma comparação LIKE pode falhar. O exemplo a seguir transmite uma variável char local para um procedimento armazenado e usa a correspondência de padrão para localizar todos os funcionários cujos sobrenomes comecem com um conjunto 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

No procedimento FindEmployee, nenhuma linha é retornada porque a variável char (@EmpLName) contém espaços em branco à direita sempre que o nome contiver menos de 20 caracteres. Como a coluna LastName é varchar, não há nenhum espaço em branco à direita. Este procedimento falha porque os espaços em branco à direita são significativos.

Entretanto, o exemplo a seguir obtém êxito porque não são adicionados espaços em branco à direita a uma variável 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';

Conjunto de resultados.

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

(2 row(s) affected)

Correspondência de padrão com o uso de LIKE

LIKE oferece suporte à correspondência de padrão ASCII e à correspondência de padrão Unicode. Quando todos os argumentos (match_expression, pattern e escape_character, se presente) forem tipos de dados de caractere ASCII, será executada a correspondência de padrão ASCII. Se algum dos argumentos for do tipo de dados Unicode, todos os argumentos serão convertidos em Unicode e será executada a correspondência de padrão Unicode. Ao usar dados Unicode (tipos de dados nchar ou nvarchar) com LIKE, os espaços em branco à direita são significativos; entretanto, para dados não-Unicode, os espaços em branco à direita não são significativos. LIKE Unicode é compatível com o padrão ISO. LIKE ASCII é compatível com versões anteriores do SQL Server.

A seguir é apresentada uma série de exemplos que mostram as diferenças em linhas retornadas entre a correspondência de padrão LIKE ASCII e 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
ObservaçãoObservação

As comparações de LIKE são afetadas por agrupamento. Para obter mais informações, consulte COLLATE (Transact-SQL).

Usando o caractere curinga %

Se o símbolo LIKE '5%' for especificado, o Mecanismo de Banco de Dados procurará o número 5 seguido por qualquer cadeia de zero ou mais caracteres.

Por exemplo, a consulta a seguir mostra todas as exibições de gerenciamento dinâmico do banco de dados AdventureWorks, porque todas começam com as letras dm.

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

Para consultar todos os objetos que não sejam exibições de gerenciamento dinâmico, use NOT LIKE 'dm%'. Se tiver um total de 32 objetos e LIKE localizar 13 nomes que correspondam ao padrão, NOT LIKE localizará os 19 objetos que não correspondem ao padrão LIKE.

Talvez você nem sempre localize os mesmos nomes com um padrão do tipo LIKE '[^d][^m]%'. Em vez de 19 nomes, poderá localizar somente 14, com todos os nomes que começam com d ou têm m como a segunda letra eliminada dos resultados, e os nomes de exibição de gerenciamento dinâmico. Isto ocorre porque as cadeias de correspondência com caracteres curinga negativos são avaliadas em etapas, um curinga de cada vez. Se a correspondência falhar em qualquer ponto da avaliação, ela será eliminada.

Usando caracteres curinga como literais

Você pode usar os caracteres curinga de correspondência de padrão como caracteres literais. Para usar um caractere curinga como um caractere literal, inclua o caractere curinga entre colchetes. A tabela a seguir mostra vários exemplos de uso da palavra-chave LIKE e dos caracteres curinga [ ].

Símbolo

Significado

LIKE '5[%]'

5%

LIKE '[_]n'

_n

LIKE '[a-cdf]'

a, b, c, d ou f

LIKE '[-acdf]'

-, a, c, d ou f

LIKE '[ [ ]'

[

LIKE ']'

]

LIKE 'abc[_]d%'

abc_d e abc_de

LIKE 'abc[def]'

abcd, abce e abcf

Correspondência de padrão com a cláusula ESCAPE

Você pode procurar cadeias de caracteres que incluam um ou mais dos caracteres curinga especiais. Por exemplo, a tabela discounts em um banco de dados customers pode armazenar valores de desconto que incluem um sinal de por cento (%). Para procurar o sinal de por cento como um caractere em vez de como um caractere curinga, a palavra-chave ESCAPE e o caractere de escape devem ser fornecidos. Por exemplo, um banco de dados de exemplo contém uma coluna denominada comment que contém o texto 30%. Para procurar quaisquer linhas que contenham a cadeia 30% em qualquer lugar da coluna comment, especifique uma cláusula WHERE, como WHERE comment LIKE '%30!%%' ESCAPE '!'. Se ESCAPE e o caractere de escape não forem especificados, o Mecanismo de Banco de Dados retornará quaisquer linhas com a cadeia 30.

Se não houver caractere depois de um caractere de escape no padrão de LIKE, o padrão não será válido e LIKE retornará FALSE. Se o caractere após um caractere de escape não for um caractere curinga, o caractere de escape será descartado e o caractere após ele será tratado como um caractere normal no padrão. Isso inclui os caracteres curinga de sinal de por cento (%), sublinhado (_) e colchete esquerdo ([) quando eles estiverem incluídos entre colchetes duplos ([ ]). Além disso, dentro dos caracteres de colchete duplo ([ ]), os caracteres de escape podem ser usados e o acento circunflexo (^), o hífen (-) e o colchete direito (]) podem seguir o caractere de escape.

Exemplos

A. Usando LIKE com o caractere curinga %

O exemplo a seguir localiza todos os números de telefone com o código de área 415 na tabela Contact.

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

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. Usando NOT LIKE com o caractere curinga %

O exemplo a seguir localiza todos os números de telefone na tabela Contact que têm códigos de área diferentes de 415.

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

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. Usando a cláusula ESCAPE

O exemplo a seguir usa a cláusula a cadeia de caracteres ESCAPE e o caractere de escape para localizar a cadeia de caracteres exata 10-15% na coluna c1 da tabela 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. Usando os caracteres curinga [ ]

O exemplo a seguir localiza Contacts com o nome Cheryl ou Sheryl.

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

O exemplo a seguir localiza as linhas de Contacts com os sobrenomes Zheng ou Zhang.

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