PATINDEX (Transact-SQL)

Aplica-se a: SQL Server (todas as versões com suporte) Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics PDW (Analytics Platform System)

Retorna a posição inicial da primeira ocorrência de um padrão em uma expressão específica ou zero, se o padrão não for encontrado, em todos os tipos de dados de caractere e de texto válidos.

Topic link iconConvenções de sintaxe do Transact-SQL

Sintaxe

PATINDEX ( '%pattern%' , expression )  

Observação

Para ver a sintaxe do Transact-SQL para o SQL Server 2014 e versões anteriores, confira a Documentação das versões anteriores.

Argumentos

padrão
É uma expressão de caractere que contém a sequência a ser localizada. Caracteres curinga podem ser usados; entretanto, o caractere % deve vir antes e seguir pattern (exceto quando você pesquisa o primeiro e último caracteres). pattern é uma expressão da categoria de tipo de dados de cadeia de caracteres. pattern é limitado a 8.000 caracteres.

Observação

Embora as expressões regulares tradicionais não sejam nativamente compatíveis no SQL Server, a correspondência de padrões complexos semelhantes pode ser obtida com o uso de várias expressões curinga. Confira a documentação de Operações de cadeia de caracteres para obter mais detalhes sobre a sintaxe do curinga.

expressão
É uma expression, geralmente, uma coluna na qual procurar o padrão especificado. expression é uma expressão da categoria de tipo de dados de cadeia de caracteres.

Tipos de retorno

bigint se expression é dos tipos de dados varchar(max) ou nvarchar(max); caso contrário, int.

Comentários

Se pattern ou expression for NULL, PATINDEX retornará NULL.

A posição inicial para PATINDEX é 1.

PATINDEX executa comparações com base na ordenação da entrada. Para fazer uma comparação em uma ordenação especificada, use COLLATE para aplicar uma ordenação explícita à entrada.

Caracteres suplementares (pares substitutos)

Ao usar ordenações SC, o valor retornado contará os pares alternativos UTF-16 no parâmetro expression como um caractere único. Para obter mais informações, consulte Suporte a ordenações e a Unicode.

0x0000 (char(0)) é um caractere indefinido em ordenações do Windows e não pode ser incluído em PATINDEX.

Exemplos

a. Exemplo simples de PATINDEX

O exemplo a seguir verifica uma cadeia de caracteres curta (interesting data) em busca do local inicial dos caracteres ter.

SELECT position = PATINDEX('%ter%', 'interesting data');  

Este é o conjunto de resultados.

position
--------
3

B. Usando um padrão com PATINDEX

O exemplo a seguir localiza a posição na qual o padrão ensure inicia em uma linha específica da coluna DocumentSummary da tabela Document no banco de dados AdventureWorks2019.

SELECT position = PATINDEX('%ensure%',DocumentSummary)  
FROM Production.Document  
WHERE DocumentNode = 0x7B40;  
GO   

Este é o conjunto de resultados.

position
--------  
64  

Se você não restringir as linhas a serem pesquisadas usando uma cláusula WHERE, a consulta retornará todas as linhas na tabela e registrará valores diferentes de zero para as linhas nas quais o padrão foi localizado e zero para todas as linhas nas quais o padrão não foi localizado.

C. Usando caracteres curinga com PATINDEX

O exemplo a seguir usa os curingas % e _ para localizar a posição na qual o padrão 'en', seguido de qualquer outro caractere e 'ure' é iniciado na cadeia de caracteres especificada (o índice inicia em 1):

SELECT position = PATINDEX('%en_ure%', 'Please ensure the door is locked!');  

Este é o conjunto de resultados.

position
--------  
8  

PATINDEX funciona da mesma forma que LIKE, então você pode usar qualquer curinga. Não é necessário colocar o padrão entre porcentagens. PATINDEX('a%', 'abc') retorna 1 e PATINDEX('%a', 'cba') retorna 3.

Diferentemente de LIKE, PATINDEX retorna uma posição, semelhante ao que CHARINDEX faz.

D. Usando expressões curinga complexas com PATINDEX

O exemplo a seguir usa o [^]operador de cadeia de caracteres para localizar a posição de um caractere que não é um número, uma letra ou um espaço.

SELECT position = PATINDEX('%[^ 0-9A-Za-z]%', 'Please ensure the door is locked!'); 

Este é o conjunto de resultados.

position
--------
33

E. Usando COLLATE com PATINDEX

O exemplo a seguir usa a função COLLATE para especificar explicitamente a ordenação da expressão que é pesquisada.

USE tempdb;  
GO  
SELECT PATINDEX ( '%ein%', 'Das ist ein Test'  COLLATE Latin1_General_BIN) ;  
GO  

Este é o conjunto de resultados.

position
--------
9

F. Usando uma variável para especificar o padrão

O exemplo a seguir usa uma variável para passar um valor para o parâmetro pattern. Este exemplo usa o banco de dados AdventureWorks2019.

DECLARE @MyValue VARCHAR(10) = 'safety';   
SELECT position = PATINDEX('%' + @MyValue + '%', DocumentSummary)   
FROM Production.Document  
WHERE DocumentNode = 0x7B40;  

Este é o conjunto de resultados.

position
--------  
22

Consulte Também

LIKE (Transact-SQL)
CHARINDEX (Transact-SQL)
LEN (Transact-SQL)
Tipos de dados (Transact-SQL)
Funções de cadeia de caracteres (Transact-SQL)
(Curinga – caracteres para correspondência) (Transact-SQL)
(Curinga – caracteres para não correspondência) (Transact-SQL)
_ (Curinga – corresponde a um caractere) (Transact-SQL)
Caractere de porcentagem (Curinga - Caracteres de Correspondência) (Transact-SQL)